@@ -3,6 +3,7 @@ import {DOM} from 'angular2/src/dom/dom_adapter';
33import { ListWrapper } from 'angular2/src/facade/collection' ;
44import { DomProtoView } from './view/proto_view' ;
55import { DomElementBinder } from './view/element_binder' ;
6+ import { TemplateCloner } from './template_cloner' ;
67
78export const NG_BINDING_CLASS_SELECTOR = '.ng-binding' ;
89export const NG_BINDING_CLASS = 'ng-binding' ;
@@ -57,9 +58,9 @@ export class ClonedProtoView {
5758 public boundElements : Element [ ] , public boundTextNodes : Node [ ] ) { }
5859}
5960
60- export function cloneAndQueryProtoView ( pv : DomProtoView , importIntoDocument : boolean ) :
61- ClonedProtoView {
62- var templateContent = pv . cloneableTemplate . clone ( importIntoDocument ) ;
61+ export function cloneAndQueryProtoView ( templateCloner : TemplateCloner , pv : DomProtoView ,
62+ importIntoDocument : boolean ) : ClonedProtoView {
63+ var templateContent = templateCloner . cloneContent ( pv . cloneableTemplate , importIntoDocument ) ;
6364
6465 var boundElements = queryBoundElements ( templateContent , pv . isSingleElementFragment ) ;
6566 var boundTextNodes = queryBoundTextNodes ( templateContent , pv . rootTextNodeIndices , boundElements ,
@@ -77,6 +78,10 @@ function queryFragments(templateContent: Node, fragmentsRootNodeCount: number[])
7778 for ( var fragmentIndex = 0 ; fragmentIndex < fragments . length ; fragmentIndex ++ ) {
7879 var fragment = ListWrapper . createFixedSize ( fragmentsRootNodeCount [ fragmentIndex ] ) ;
7980 fragments [ fragmentIndex ] = fragment ;
81+ // Note: the 2nd, 3rd, ... fragments are separated by each other via a '|'
82+ if ( fragmentIndex >= 1 ) {
83+ childNode = DOM . nextSibling ( childNode ) ;
84+ }
8085 for ( var i = 0 ; i < fragment . length ; i ++ ) {
8186 fragment [ i ] = childNode ;
8287 childNode = DOM . nextSibling ( childNode ) ;
@@ -141,45 +146,3 @@ export function prependAll(parentNode: Node, nodes: Node[]) {
141146 lastInsertedNode = node ;
142147 } ) ;
143148}
144-
145- export interface CloneableTemplate { clone ( importIntoDoc : boolean ) : Node ; }
146-
147- export class SerializedCloneableTemplate implements CloneableTemplate {
148- templateString : string ;
149- constructor ( templateRoot : Element ) { this . templateString = DOM . getInnerHTML ( templateRoot ) ; }
150- clone ( importIntoDoc : boolean ) : Node {
151- var result = DOM . content ( DOM . createTemplate ( this . templateString ) ) ;
152- if ( importIntoDoc ) {
153- result = DOM . adoptNode ( result ) ;
154- }
155- return result ;
156- }
157- }
158-
159- export class ReferenceCloneableTemplate implements CloneableTemplate {
160- constructor ( public templateRoot : Element ) { }
161- clone ( importIntoDoc : boolean ) : Node {
162- if ( importIntoDoc ) {
163- return DOM . importIntoDoc ( DOM . content ( this . templateRoot ) ) ;
164- } else {
165- return DOM . clone ( DOM . content ( this . templateRoot ) ) ;
166- }
167- }
168- }
169-
170- export function prepareTemplateForClone ( templateRoot : Element ) : CloneableTemplate {
171- var root = DOM . content ( templateRoot ) ;
172- var elementCount = DOM . querySelectorAll ( root , '*' ) . length ;
173- var firstChild = DOM . firstChild ( root ) ;
174- var forceSerialize =
175- isPresent ( firstChild ) && DOM . isCommentNode ( firstChild ) ? DOM . nodeValue ( firstChild ) : null ;
176- if ( forceSerialize == 'nocache' ) {
177- return new SerializedCloneableTemplate ( templateRoot ) ;
178- } else if ( forceSerialize == 'cache' ) {
179- return new ReferenceCloneableTemplate ( templateRoot ) ;
180- } else if ( elementCount > MAX_IN_MEMORY_ELEMENTS_PER_TEMPLATE ) {
181- return new SerializedCloneableTemplate ( templateRoot ) ;
182- } else {
183- return new ReferenceCloneableTemplate ( templateRoot ) ;
184- }
185- }
0 commit comments