fix(injectors): sync injector tree with dom element tree.

Changes adds createGrowableSize method to allow for growable lists with fixed
start.

Closes: #2498
This commit is contained in:
Rado Kirov
2015-06-22 17:52:34 -07:00
parent 24646e7eb8
commit d800d2f5d7
7 changed files with 64 additions and 26 deletions

View File

@ -1027,7 +1027,8 @@ export class ElementInjector extends TreeNode<ElementInjector> {
if (queryRef.query.descendants == false) {
if (this == queryRef.originator) {
this._addQueryToTreeSelfAndRecurse(queryRef);
} else if (this.parent == queryRef.originator && this._proto.distanceToParent == 1) {
// TODO(rado): add check for distance to parent = 1 when issue #2707 is fixed.
} else if (this.parent == queryRef.originator) {
this._assignQueryRef(queryRef);
}
} else {

View File

@ -86,6 +86,7 @@ export class AppViewManagerUtils {
this._hydrateView(hostView, injector, null, new Object(), null);
}
// Misnomer: this method is attaching next to the view container.
attachViewInContainer(parentView: viewModule.AppView, boundElementIndex: number,
contextView: viewModule.AppView, contextBoundElementIndex: number,
atIndex: number, view: viewModule.AppView) {
@ -104,7 +105,11 @@ export class AppViewManagerUtils {
}
var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
for (var i = view.rootElementInjectors.length - 1; i >= 0; i--) {
view.rootElementInjectors[i].linkAfter(elementInjector, sibling);
if (isPresent(elementInjector.parent)) {
view.rootElementInjectors[i].linkAfter(elementInjector.parent, sibling);
} else {
contextView.rootElementInjectors.push(view.rootElementInjectors[i]);
}
}
}
@ -115,7 +120,13 @@ export class AppViewManagerUtils {
view.changeDetector.remove();
ListWrapper.removeAt(viewContainer.views, atIndex);
for (var i = 0; i < view.rootElementInjectors.length; ++i) {
view.rootElementInjectors[i].unlink();
var inj = view.rootElementInjectors[i];
if (isPresent(inj.parent)) {
inj.unlink();
} else {
var removeIdx = ListWrapper.indexOf(parentView.rootElementInjectors, inj);
ListWrapper.removeAt(parentView.rootElementInjectors, removeIdx);
}
}
}