| 
									
										
										
										
											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) { | 
					
						
							|  |  |  |   const bindings = def.bindings; | 
					
						
							|  |  |  |   let changed = false; | 
					
						
							|  |  |  |   // Note: fallthrough is intended!
 | 
					
						
							|  |  |  |   switch (bindings.length) { | 
					
						
							|  |  |  |     case 10: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 9, v9)) changed = true; | 
					
						
							|  |  |  |     case 9: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 8, v8)) changed = true; | 
					
						
							|  |  |  |     case 8: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 7, v7)) changed = true; | 
					
						
							|  |  |  |     case 7: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 6, v6)) changed = true; | 
					
						
							|  |  |  |     case 6: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 5, v5)) changed = true; | 
					
						
							|  |  |  |     case 5: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 4, v4)) changed = true; | 
					
						
							|  |  |  |     case 4: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 3, v3)) changed = true; | 
					
						
							|  |  |  |     case 3: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 2, v2)) changed = true; | 
					
						
							|  |  |  |     case 2: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 1, v1)) changed = true; | 
					
						
							|  |  |  |     case 1: | 
					
						
							|  |  |  |       if (checkAndUpdateBinding(view, def, 0, v0)) changed = true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (changed) { | 
					
						
							|  |  |  |     let value = ''; | 
					
						
							|  |  |  |     // Note: fallthrough is intended!
 | 
					
						
							|  |  |  |     switch (bindings.length) { | 
					
						
							|  |  |  |       case 10: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v9, bindings[9]); | 
					
						
							|  |  |  |       case 9: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v8, bindings[8]) + value; | 
					
						
							|  |  |  |       case 8: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v7, bindings[7]) + value; | 
					
						
							|  |  |  |       case 7: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v6, bindings[6]) + value; | 
					
						
							|  |  |  |       case 6: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v5, bindings[5]) + value; | 
					
						
							|  |  |  |       case 5: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v4, bindings[4]) + value; | 
					
						
							|  |  |  |       case 4: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v3, bindings[3]) + value; | 
					
						
							|  |  |  |       case 3: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v2, bindings[2]) + value; | 
					
						
							|  |  |  |       case 2: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v1, bindings[1]) + value; | 
					
						
							|  |  |  |       case 1: | 
					
						
							|  |  |  |         value = _addInterpolationPart(v0, bindings[0]) + value; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     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
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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; | 
					
						
							|  |  |  | } |