我有一个Angular 2控制器,如下所示:
@Component({
selector: 'my-component',
template: '<div>The value is: {{ value }}</div>',
})
class MyComponent implements OnInit {
@Input()
value: string;
@Output
valueChange = new EventEmitter<number>();
ngOnInit() {
this.valueChange.subscribe(value => {
console.log('new value:', value); // <-- does not get triggered
});
}
}
但是当value
的值从模板绑定更改时:
<my-component [value]="someValue" /> <!-- valueChange not triggered! -->
valueChange
事件未被触发,即使模板正确更新并显示新值,组件也不知道它已被更改。
如何检测控制器上的输入属性何时发生变化?
答案 0 :(得分:12)
在我看来,Output
是您的组件向其他人发出事件,以便他们在必要时更新其视图,它只应用于内部需要广播的更改(因此名称{ {1}})。在Output
更改时触发Output
事件可能会导致意外行为(因为现在内部和外部的所有更改都会触发Input
,而不再是valueChange
更改
在您的情况下,如果您希望在Output
更改时执行操作,则可以将其设为安装程序:
value
答案 1 :(得分:7)
我使用setter来检测输入变量何时被修改。您必须使用inputs
装饰器中的@Component
键而不是@Input
声明才能使其正常工作,如下所示:
@Component({
selector: 'my-component',
template: '<div>The value is: {{ value }}</div>',
inputs: ['value']
})
class MyComponent {
private _value: string;
@Output
valueChange = new EventEmitter<number>();
set value(value) {
this._value = value;
console.log('new value:', value);
this.valueChange.emit(value);
}
get value(value) {
return this._value;
}
}
另外,仅供参考,类方法为ngOnInit
而非onInit
。
答案 2 :(得分:2)
我已经能够通过OnChanges
:
ngOnChanges(changes) {
for (let key in changes) {
if (this[key + 'Change'])
this[key + 'Change'].emit(changes[key].currentValue);
}
}
只要Angular检测到更改,它就会自动触发Change
事件......但有没有办法在本地执行此操作?