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:
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -107,7 +107,7 @@ export class NgFor {
|
||||
return movedTuples;
|
||||
}
|
||||
|
||||
static bulkInsert(tuples, viewContainer, protoViewRef) {
|
||||
static bulkInsert(tuples, viewContainer: ViewContainerRef, protoViewRef: ProtoViewRef) {
|
||||
tuples.sort((a, b) => a.record.currentIndex - b.record.currentIndex);
|
||||
for (var i = 0; i < tuples.length; i++) {
|
||||
var tuple = tuples[i];
|
||||
|
@ -93,6 +93,8 @@ class StringMapWrapper {
|
||||
class ListWrapper {
|
||||
static List clone(Iterable l) => new List.from(l);
|
||||
static List createFixedSize(int size) => new List(size);
|
||||
static List createGrowableSize(int size) =>
|
||||
new List.generate(size, (_) => null, growable: true);
|
||||
static get(List m, int k) => m[k];
|
||||
static void set(List m, int k, v) {
|
||||
m[k] = v;
|
||||
|
@ -140,7 +140,10 @@ export class StringMapWrapper {
|
||||
}
|
||||
|
||||
export class ListWrapper {
|
||||
// JS has no way to express a staticly fixed size list, but dart does so we
|
||||
// keep both methods.
|
||||
static createFixedSize(size): List<any> { return new List(size); }
|
||||
static createGrowableSize(size): List<any> { return new List(size); }
|
||||
static get(m, k) { return m[k]; }
|
||||
static set(m, k, v) { m[k] = v; }
|
||||
static clone(array: List<any>) { return array.slice(0); }
|
||||
|
Reference in New Issue
Block a user