X Tutup
Skip to content

Commit 7879761

Browse files
committed
fix(element_injector): inject the containing change detector ref to directives
1 parent f7dfd23 commit 7879761

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

modules/angular2/src/core/compiler/element_injector.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -589,8 +589,10 @@ export class ElementInjector extends TreeNode<ElementInjector> implements Depend
589589
var key: Key = dep.key;
590590

591591
if (!(dep instanceof DirectiveDependency)) return undefinedValue;
592+
if (!(binding instanceof DirectiveBinding)) return undefinedValue;
592593

593594
var dirDep = <DirectiveDependency>dep;
595+
var dirBin = <DirectiveBinding>binding;
594596
var staticKeys = StaticKeys.instance();
595597

596598

@@ -601,8 +603,12 @@ export class ElementInjector extends TreeNode<ElementInjector> implements Depend
601603
if (isPresent(dirDep.queryDecorator)) return this._findQuery(dirDep.queryDecorator).list;
602604

603605
if (dirDep.key.id === StaticKeys.instance().changeDetectorRefId) {
604-
var componentView = this._preBuiltObjects.view.componentChildViews[this._proto.index];
605-
return componentView.changeDetector.ref;
606+
if (dirBin.metadata.type === DirectiveMetadata.COMPONENT_TYPE) {
607+
var componentView = this._preBuiltObjects.view.componentChildViews[this._proto.index];
608+
return componentView.changeDetector.ref;
609+
} else {
610+
return this._preBuiltObjects.view.changeDetector.ref;
611+
}
606612
}
607613

608614
if (dirDep.key.id === StaticKeys.instance().elementRefId) {

modules/angular2/test/core/compiler/element_injector_spec.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,13 @@ class OptionallyInjectsProtoViewRef {
209209
}
210210

211211
@Injectable()
212-
class NeedsChangeDetectorRef {
212+
class DirectiveNeedsChangeDetectorRef {
213+
changeDetectorRef;
214+
constructor(cdr: ChangeDetectorRef) { this.changeDetectorRef = cdr; }
215+
}
216+
217+
@Injectable()
218+
class ComponentNeedsChangeDetectorRef {
213219
changeDetectorRef;
214220
constructor(cdr: ChangeDetectorRef) { this.changeDetectorRef = cdr; }
215221
}
@@ -944,16 +950,28 @@ export function main() {
944950
expect(inj.get(NeedsElementRef).elementRef).toBe(defaultPreBuiltObjects.view.elementRefs[0]);
945951
});
946952

947-
it('should inject ChangeDetectorRef', () => {
953+
it("should inject ChangeDetectorRef of the component's view into the component", () => {
948954
var cd = new DynamicChangeDetector(null, null, null, [], []);
949955
var view = <any>new DummyView();
950956
var childView = new DummyView();
951957
childView.changeDetector = cd;
952958
view.componentChildViews = [childView];
953-
var inj = injector(ListWrapper.concat([NeedsChangeDetectorRef], extraBindings), null, false,
959+
var binding = DirectiveBinding.createFromType(ComponentNeedsChangeDetectorRef, new dirAnn.Component());
960+
var inj = injector(ListWrapper.concat([binding], extraBindings), null, true,
961+
new PreBuiltObjects(null, view, null));
962+
963+
expect(inj.get(ComponentNeedsChangeDetectorRef).changeDetectorRef).toBe(cd.ref);
964+
});
965+
966+
it("should inject ChangeDetectorRef of the containing component into directives", () => {
967+
var cd = new DynamicChangeDetector(null, null, null, [], []);
968+
var view = <any>new DummyView();
969+
view.changeDetector =cd;
970+
var binding = DirectiveBinding.createFromType(DirectiveNeedsChangeDetectorRef, new dirAnn.Directive());
971+
var inj = injector(ListWrapper.concat([binding], extraBindings), null, false,
954972
new PreBuiltObjects(null, view, null));
955973

956-
expect(inj.get(NeedsChangeDetectorRef).changeDetectorRef).toBe(cd.ref);
974+
expect(inj.get(DirectiveNeedsChangeDetectorRef).changeDetectorRef).toBe(cd.ref);
957975
});
958976

959977
it('should inject ViewContainerRef', () => {

0 commit comments

Comments
 (0)
X Tutup