Skip to content

Commit

Permalink
fix(injectors): reset the construction counter in dynamic strategy.
Browse files Browse the repository at this point in the history
Adds tests for hydrate / dehydrate in cycle.

Closes angular#3635
  • Loading branch information
rkirov committed Aug 18, 2015
1 parent 5f7d4fa commit 272ad61
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 3 deletions.
7 changes: 4 additions & 3 deletions modules/angular2/src/core/compiler/element_injector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -673,7 +673,7 @@ export class ElementInjector extends TreeNode<ElementInjector> implements Depend

private _addViewQuery(queryRef: QueryRef, host: ElementInjector): void {
if (isBlank(queryRef) || !queryRef.isViewQuery || this._hasQuery(queryRef)) return;
if (host._query0.originator == host) {
if (queryRef.originator == host) {
// TODO(rado): Replace this.parent check with distanceToParent = 1 when
// https://github.com/angular/angular/issues/2707 is fixed.
if (!queryRef.query.descendants && isPresent(this.parent)) return;
Expand Down Expand Up @@ -863,8 +863,8 @@ export class ElementInjector extends TreeNode<ElementInjector> implements Depend

getRootViewInjectors(): ElementInjector[] {
var view = this._preBuiltObjects.view;
return view.getNestedView(view.elementOffset + this.getBoundElementIndex())
.rootElementInjectors;
var nestedView = view.getNestedView(view.elementOffset + this.getBoundElementIndex());
return isPresent(nestedView) ? nestedView.rootElementInjectors : [];
}
}

Expand Down Expand Up @@ -1068,6 +1068,7 @@ class ElementInjectorDynamicStrategy implements _ElementInjectorStrategy {
hydrate(): void {
var inj = this.injectorStrategy;
var p = inj.protoStrategy;
inj.resetConstructionCounter();

for (var i = 0; i < p.keyIds.length; i++) {
if (p.bindings[i] instanceof DirectiveBinding && isPresent(p.keyIds[i]) &&
Expand Down
44 changes: 44 additions & 0 deletions modules/angular2/test/core/compiler/element_injector_spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import {
import {
Attribute,
Query,
ViewQuery,
ComponentMetadata,
DirectiveMetadata,
LifecycleEvent
Expand All @@ -51,9 +52,11 @@ import {QueryList} from 'angular2/src/core/compiler/query_list';
@IMPLEMENTS(AppView)
class DummyView extends SpyObject {
changeDetector;
elementOffset: number;
constructor() {
super(AppView);
this.changeDetector = null;
this.elementOffset = 0;
}
noSuchMethod(m) { return super.noSuchMethod(m); }
}
Expand Down Expand Up @@ -159,6 +162,12 @@ class NeedsQuery {
constructor(@Query(CountingDirective) query: QueryList<CountingDirective>) { this.query = query; }
}

@Injectable()
class NeedsViewQuery {
query: QueryList<CountingDirective>;
constructor(@ViewQuery(CountingDirective) query: QueryList<CountingDirective>) { this.query = query; }
}

@Injectable()
class NeedsQueryByVarBindings {
query: QueryList<any>;
Expand Down Expand Up @@ -850,6 +859,41 @@ export function main() {
});
});

describe("getRootViewInjectors", () => {
it("should return an empty array if there is no nested view", () => {
var inj = injector(extraBindings);
expect(inj.getRootViewInjectors()).toEqual([]);
});
});

describe("dehydrate", () => {
function cycleHydrate(inj: ElementInjector, host=null): void {
// Each injection supports 3 query slots, so we cycle 4 times.
for (var i = 0; i < 4; i++) {
inj.dehydrate();
inj.hydrate(null, host, defaultPreBuiltObjects);
}
}

it("should handle repeated hydration / dehydration", () => {
var inj = injector(extraBindings);
cycleHydrate(inj);
});

it("should handle repeated hydration / dehydration with query present", () => {
var inj = injector(ListWrapper.concat([NeedsQuery], extraBindings));
cycleHydrate(inj);
});


it("should handle repeated hydration / dehydration with view query present", () => {
var inj = injector(extraBindings);
var host = injector(ListWrapper.concat([NeedsViewQuery], extraBindings));

cycleHydrate(inj, host);
});
});

describe("lifecycle", () => {
it("should call onDestroy on directives subscribed to this event", () => {
var inj = injector(ListWrapper.concat(
Expand Down

0 comments on commit 272ad61

Please sign in to comment.