| 
									
										
										
										
											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
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {Injectable, Injector} from '../di'; | 
					
						
							|  |  |  | import {unimplemented} from '../facade/errors'; | 
					
						
							|  |  |  | import {ComponentFactory, ComponentRef} from '../linker/component_factory'; | 
					
						
							|  |  |  | import {ElementRef} from '../linker/element_ref'; | 
					
						
							|  |  |  | import {TemplateRef} from '../linker/template_ref'; | 
					
						
							|  |  |  | import {ViewContainerRef} from '../linker/view_container_ref'; | 
					
						
							|  |  |  | import {EmbeddedViewRef, ViewRef} from '../linker/view_ref'; | 
					
						
							|  |  |  | import {RenderComponentType, Renderer, RootRenderer} from '../render/api'; | 
					
						
							|  |  |  | import {Sanitizer, SecurityContext} from '../security'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import {NodeData, NodeDef, Services, ViewData, ViewDefinition} from './types'; | 
					
						
							|  |  |  | import {checkAndUpdateView, checkNoChangesView, createEmbeddedView, destroyView} from './view'; | 
					
						
							|  |  |  | import {attachEmbeddedView, detachEmbeddedView, rootRenderNodes} from './view_attach'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Injectable() | 
					
						
							|  |  |  | export class DefaultServices implements Services { | 
					
						
							|  |  |  |   constructor(private _rootRenderer: RootRenderer, private _sanitizer: Sanitizer) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   renderComponent(rcp: RenderComponentType): Renderer { | 
					
						
							|  |  |  |     return this._rootRenderer.renderComponent(rcp); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   sanitize(context: SecurityContext, value: string): string { | 
					
						
							|  |  |  |     return this._sanitizer.sanitize(context, value); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // Note: This needs to be here to prevent a cycle in source files.
 | 
					
						
							|  |  |  |   createViewContainerRef(data: NodeData): ViewContainerRef { return new ViewContainerRef_(data); } | 
					
						
							|  |  |  |   // Note: This needs to be here to prevent a cycle in source files.
 | 
					
						
							|  |  |  |   createTemplateRef(parentView: ViewData, def: NodeDef): TemplateRef<any> { | 
					
						
							|  |  |  |     return new TemplateRef_(parentView, def); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ViewContainerRef_ implements ViewContainerRef { | 
					
						
							|  |  |  |   constructor(private _data: NodeData) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get element(): ElementRef { return <ElementRef>unimplemented(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get injector(): Injector { return <Injector>unimplemented(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get parentInjector(): Injector { return <Injector>unimplemented(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   clear(): void { | 
					
						
							| 
									
										
										
										
											2017-01-23 10:23:44 -08:00
										 |  |  |     const len = this._data.elementOrText.embeddedViews.length; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |     for (let i = len - 1; i >= 0; i--) { | 
					
						
							|  |  |  |       const view = detachEmbeddedView(this._data, i); | 
					
						
							|  |  |  |       destroyView(view); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-23 10:23:44 -08:00
										 |  |  |   get(index: number): ViewRef { | 
					
						
							|  |  |  |     return new ViewRef_(this._data.elementOrText.embeddedViews[index]); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-23 10:23:44 -08:00
										 |  |  |   get length(): number { return this._data.elementOrText.embeddedViews.length; }; | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   createEmbeddedView<C>(templateRef: TemplateRef<C>, context?: C, index?: number): | 
					
						
							|  |  |  |       EmbeddedViewRef<C> { | 
					
						
							|  |  |  |     const viewRef = templateRef.createEmbeddedView(context); | 
					
						
							|  |  |  |     this.insert(viewRef, index); | 
					
						
							|  |  |  |     return viewRef; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   createComponent<C>( | 
					
						
							|  |  |  |       componentFactory: ComponentFactory<C>, index?: number, injector?: Injector, | 
					
						
							|  |  |  |       projectableNodes?: any[][]): ComponentRef<C> { | 
					
						
							|  |  |  |     return unimplemented(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   insert(viewRef: ViewRef, index?: number): ViewRef { | 
					
						
							|  |  |  |     const viewData = (<ViewRef_>viewRef)._view; | 
					
						
							|  |  |  |     attachEmbeddedView(this._data, index, viewData); | 
					
						
							|  |  |  |     return viewRef; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   move(viewRef: ViewRef, currentIndex: number): ViewRef { return unimplemented(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   indexOf(viewRef: ViewRef): number { | 
					
						
							| 
									
										
										
										
											2017-01-23 10:23:44 -08:00
										 |  |  |     return this._data.elementOrText.embeddedViews.indexOf((<ViewRef_>viewRef)._view); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   remove(index?: number): void { | 
					
						
							|  |  |  |     const viewData = detachEmbeddedView(this._data, index); | 
					
						
							|  |  |  |     destroyView(viewData); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   detach(index?: number): ViewRef { | 
					
						
							|  |  |  |     const view = this.get(index); | 
					
						
							|  |  |  |     detachEmbeddedView(this._data, index); | 
					
						
							|  |  |  |     return view; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ViewRef_ implements EmbeddedViewRef<any> { | 
					
						
							|  |  |  |   /** @internal */ | 
					
						
							|  |  |  |   _view: ViewData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constructor(_view: ViewData) { this._view = _view; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get rootNodes(): any[] { return rootRenderNodes(this._view); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get context() { return this._view.context; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get destroyed(): boolean { return unimplemented(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   markForCheck(): void { unimplemented(); } | 
					
						
							|  |  |  |   detach(): void { unimplemented(); } | 
					
						
							|  |  |  |   detectChanges(): void { checkAndUpdateView(this._view); } | 
					
						
							|  |  |  |   checkNoChanges(): void { checkNoChangesView(this._view); } | 
					
						
							|  |  |  |   reattach(): void { unimplemented(); } | 
					
						
							|  |  |  |   onDestroy(callback: Function) { unimplemented(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   destroy() { unimplemented(); } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TemplateRef_ implements TemplateRef<any> { | 
					
						
							|  |  |  |   constructor(private _parentView: ViewData, private _def: NodeDef) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   createEmbeddedView(context: any): EmbeddedViewRef<any> { | 
					
						
							|  |  |  |     return new ViewRef_(createEmbeddedView(this._parentView, this._def, context)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   get elementRef(): ElementRef { | 
					
						
							| 
									
										
										
										
											2017-01-23 10:23:44 -08:00
										 |  |  |     return new ElementRef(this._parentView.nodes[this._def.index].elementOrText.node); | 
					
						
							| 
									
										
										
										
											2017-01-20 13:10:57 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | } |