| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  | import {isDevMode} from '../application_ref'; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | import {looseIdentical} from '../facade/lang'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  | import {BindingDef, BindingType, DebugContext, NodeData, NodeDef, NodeFlags, NodeType, RootData, Services, TextData, ViewData, ViewFlags, asElementData, asTextData} from './types'; | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  | import {checkAndUpdateBinding, getParentRenderElement, sliceErrorStack} from './util'; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  | export function textDef(ngContentIndex: number, constants: string[]): NodeDef { | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |   // skip the call to sliceErrorStack itself + the call to this function.
 | 
					
						
							|  |  |  |   const source = isDevMode() ? sliceErrorStack(2, 3) : ''; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   const bindings: BindingDef[] = new Array(constants.length - 1); | 
					
						
							|  |  |  |   for (let i = 1; i < constants.length; i++) { | 
					
						
							|  |  |  |     bindings[i - 1] = { | 
					
						
							| 
									
										
										
										
											2017-02-09 14:59:57 -08:00
										 |  |  |       type: BindingType.TextInterpolation, | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       name: undefined, | 
					
						
							| 
									
										
										
										
											2017-02-17 08:56:36 -08:00
										 |  |  |       ns: undefined, | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |       nonMinifiedName: undefined, | 
					
						
							|  |  |  |       securityContext: undefined, | 
					
						
							|  |  |  |       suffix: constants[i] | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     type: NodeType.Text, | 
					
						
							|  |  |  |     // will bet set by the view definition
 | 
					
						
							|  |  |  |     index: undefined, | 
					
						
							|  |  |  |     reverseChildIndex: undefined, | 
					
						
							|  |  |  |     parent: undefined, | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  |     renderParent: undefined, | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     bindingIndex: undefined, | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |     disposableIndex: undefined, | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     // regular values
 | 
					
						
							|  |  |  |     flags: 0, | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  |     childFlags: 0, | 
					
						
							|  |  |  |     childMatchedQueries: 0, | 
					
						
							|  |  |  |     matchedQueries: {}, | 
					
						
							|  |  |  |     matchedQueryIds: 0, | 
					
						
							|  |  |  |     references: {}, ngContentIndex, | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     childCount: 0, bindings, | 
					
						
							| 
									
										
										
										
											2017-01-19 10:25:03 -08:00
										 |  |  |     disposableCount: 0, | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     element: undefined, | 
					
						
							|  |  |  |     provider: undefined, | 
					
						
							| 
									
										
										
										
											2017-01-26 17:07:37 -08:00
										 |  |  |     text: {prefix: constants[0], source}, | 
					
						
							| 
									
										
										
										
											2017-01-25 13:45:07 -08:00
										 |  |  |     pureExpression: undefined, | 
					
						
							|  |  |  |     query: undefined, | 
					
						
							| 
									
										
										
										
											2017-01-31 08:51:42 -08:00
										 |  |  |     ngContent: undefined | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 13:45:07 -08:00
										 |  |  | export function createText(view: ViewData, renderHost: any, def: NodeDef): TextData { | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   let renderNode: any; | 
					
						
							| 
									
										
										
										
											2017-02-16 13:55:55 -08:00
										 |  |  |   const renderer = view.renderer; | 
					
						
							| 
									
										
										
										
											2017-02-03 15:20:50 -08:00
										 |  |  |   renderNode = renderer.createText(def.text.prefix); | 
					
						
							| 
									
										
										
										
											2017-02-15 08:36:49 -08:00
										 |  |  |   const parentEl = getParentRenderElement(view, renderHost, def); | 
					
						
							|  |  |  |   if (parentEl) { | 
					
						
							|  |  |  |     renderer.appendChild(parentEl, renderNode); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-01-25 13:45:07 -08:00
										 |  |  |   return {renderText: renderNode}; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function checkAndUpdateTextInline( | 
					
						
							|  |  |  |     view: ViewData, def: NodeDef, v0: any, v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, | 
					
						
							|  |  |  |     v7: any, v8: any, v9: any) { | 
					
						
							|  |  |  |   let changed = false; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |   const bindings = def.bindings; | 
					
						
							|  |  |  |   const bindLen = bindings.length; | 
					
						
							|  |  |  |   if (bindLen > 0 && checkAndUpdateBinding(view, def, 0, v0)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 1 && checkAndUpdateBinding(view, def, 1, v1)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 2 && checkAndUpdateBinding(view, def, 2, v2)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 3 && checkAndUpdateBinding(view, def, 3, v3)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 4 && checkAndUpdateBinding(view, def, 4, v4)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 5 && checkAndUpdateBinding(view, def, 5, v5)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 6 && checkAndUpdateBinding(view, def, 6, v6)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 7 && checkAndUpdateBinding(view, def, 7, v7)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 8 && checkAndUpdateBinding(view, def, 8, v8)) changed = true; | 
					
						
							|  |  |  |   if (bindLen > 9 && checkAndUpdateBinding(view, def, 9, v9)) changed = true; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (changed) { | 
					
						
							| 
									
										
										
										
											2017-02-20 15:06:23 -08:00
										 |  |  |     let value = def.text.prefix; | 
					
						
							|  |  |  |     if (bindLen > 0) value += _addInterpolationPart(v0, bindings[0]); | 
					
						
							|  |  |  |     if (bindLen > 1) value += _addInterpolationPart(v1, bindings[1]); | 
					
						
							|  |  |  |     if (bindLen > 2) value += _addInterpolationPart(v2, bindings[2]); | 
					
						
							|  |  |  |     if (bindLen > 3) value += _addInterpolationPart(v3, bindings[3]); | 
					
						
							|  |  |  |     if (bindLen > 4) value += _addInterpolationPart(v4, bindings[4]); | 
					
						
							|  |  |  |     if (bindLen > 5) value += _addInterpolationPart(v5, bindings[5]); | 
					
						
							|  |  |  |     if (bindLen > 6) value += _addInterpolationPart(v6, bindings[6]); | 
					
						
							|  |  |  |     if (bindLen > 7) value += _addInterpolationPart(v7, bindings[7]); | 
					
						
							|  |  |  |     if (bindLen > 8) value += _addInterpolationPart(v8, bindings[8]); | 
					
						
							|  |  |  |     if (bindLen > 9) value += _addInterpolationPart(v9, bindings[9]); | 
					
						
							| 
									
										
										
										
											2017-01-25 13:45:07 -08:00
										 |  |  |     const renderNode = asTextData(view, def.index).renderText; | 
					
						
							| 
									
										
										
										
											2017-02-16 13:55:55 -08:00
										 |  |  |     view.renderer.setValue(renderNode, value); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export function checkAndUpdateTextDynamic(view: ViewData, def: NodeDef, values: any[]) { | 
					
						
							|  |  |  |   const bindings = def.bindings; | 
					
						
							| 
									
										
										
										
											2017-01-20 09:21:09 -08:00
										 |  |  |   let changed = false; | 
					
						
							|  |  |  |   for (let i = 0; i < values.length; i++) { | 
					
						
							|  |  |  |     // Note: We need to loop over all values, so that
 | 
					
						
							|  |  |  |     // the old values are updates as well!
 | 
					
						
							|  |  |  |     if (checkAndUpdateBinding(view, def, i, values[i])) { | 
					
						
							|  |  |  |       changed = true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  |   if (changed) { | 
					
						
							|  |  |  |     let value = ''; | 
					
						
							|  |  |  |     for (let i = 0; i < values.length; i++) { | 
					
						
							|  |  |  |       value = value + _addInterpolationPart(values[i], bindings[i]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     value = def.text.prefix + value; | 
					
						
							| 
									
										
										
										
											2017-01-25 13:45:07 -08:00
										 |  |  |     const renderNode = asTextData(view, def.index).renderText; | 
					
						
							| 
									
										
										
										
											2017-02-16 13:55:55 -08:00
										 |  |  |     view.renderer.setValue(renderNode, value); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function _addInterpolationPart(value: any, binding: BindingDef): string { | 
					
						
							|  |  |  |   const valueStr = value != null ? value.toString() : ''; | 
					
						
							|  |  |  |   return valueStr + binding.suffix; | 
					
						
							|  |  |  | } |