【发布时间】:2018-09-26 15:54:30
【问题描述】:
我有一个如下所示的子组件:
@Component({
selector: 'app-child',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
{{text}}
`
})
export class ChildComponent {
@Input() text = '';
constructor(public host: ElementRef) { }
}
还有一个看起来像这样的父组件:
@Component({
selector: 'app-parent',
changeDetection: ChangeDetectionStrategy.OnPush,
template: `<ng-content></ng-content>`
})
export class ParentComponent {
@ContentChild(ChildComponent) child: ChildComponent;
constructor(private cdr: ChangeDetectorRef) { }
ngAfterContentInit() {
this.child.text = 'hello';
this.child.host.nativeElement.addEventListener('click', () => {
this.child.text = 'from click';
this.cdr.detectChanges();
});
}
第一次分配给text 属性工作正常,但是当我单击按钮并尝试再次更改text 属性时,什么也没有发生。
这很令人困惑,因为据我所知:
1. click 事件应该触发变化检测,并且 text 属性不同,所以应该已经更新了。
2. 我明确地调用了detectChanges(),这也应该检查我所知道的孩子。
我错过了什么?
【问题讨论】:
-
我不确定,但由于
text是@Input属性,Angular 可能希望您将此值从父级传递给子级,而不是直接从父级修改它。 -
不要认为这是问题所在,因为第一次调用是有效的。
-
是的,但变更检测的第一次运行往往是边缘情况或规则的例外,但让我们看看是否有人可以更深入地解释这一点。
标签: javascript angular