X Tutup
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a random typo I caught, not related to the rest of the bug fix.

// 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 : [];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you add this check because some test failed? Maybe add a unit test to make sure that it works when nestedView is not present.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done.

}
}

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
X Tutup