Angular 2:如何检测组件上输入属性的属性更改?
Angular 2:如何检测组件上输入属性的属性更改?
我有一个Angular 2的控制器,如下所示:
@Component({ selector: 'my-component', template: 'The value is: {{ value }}', }) class MyComponent implements OnInit { @Input() value: string; @Output() valueChange = new EventEmitter(); ngOnInit() { this.valueChange.subscribe(value => { console.log('new value:', value); // <-- 不会被触发 }); } }
但是,当`value`的值从模板绑定改变时:
`valueChange`事件不会被触发,所以即使模板正确更新并显示新值,组件也不知道它已经被改变。
如何检测控制器上的输入属性何时改变?
问题原因:在Angular 2中,当我们需要检测输入属性的变化时,可以通过实现OnChanges接口来实现。但是是否有一种原生的方法来实现这个功能呢?
解决方法:可以通过实现OnChanges接口来实现检测输入属性的变化。具体的实现方式是在ngOnChanges方法中遍历changes对象,如果属性名称加上"Change"后存在于组件中,则触发对应的Change事件。
以下是实现代码:
ngOnChanges(changes) { for (let key in changes) { if (this[key + 'Change']) this[key + 'Change'].emit(changes[key].currentValue); } }
通过这种方式,当Angular检测到输入属性发生变化时,会自动触发对应的Change事件。
在Angular 2中,如何检测组件的输入属性的变化?
在我看来,Output
用于组件向其他组件发出事件,以便在必要时更新视图,它应该仅用于需要广播的内部变化(因此称为Output
)。在Input
属性变化时触发Output
事件可能会导致意外行为(因为现在valueChange
会对内部和外部的所有变化都触发,实际上已经不再是一个Output
事件了)。
在你的情况下,如果你想在value
变化时执行一些操作,你可以将其设置为一个setter方法:
private _value: string; get value(): string { return this._value; } set value(val: string) { this._value = val; console.log('new value:', value); // 在这里执行你的逻辑! }