我有一个角度组件,有一个输入 Person
export class Person {
public name = 'Initial Name';
}
export class PersonComponent implements OnInit, OnChanges {
@Input() public person: Person;
ngOnChanges(changes: SimpleChanges): void {
console.log('changed');
}
}
在此组件的父组件中,如果我替换作为子组件的输入的 Person
对象,则会在子组件中触发 ngOnChanges()
.
但是,如果我只从父组件更改 Person
对象的 name
,则不会在子组件中触发 ngOnChanges()
(无论如何,如果我将人名绑定到子模板中的html元素,它会更新) .
当输入的属性发生变化时,有没有办法在子组件中得到通知?
4 回答
不,ngOnChanges挂钩只会在引用更改时触发 . 在更改父组件中的name属性时,您可以通过执行此操作轻松实现目标:
您始终可以在
Person
上创建一个Observable,只要属性发生更改,它就会发出 .从'rxjs'导入;
这样,您可以订阅
person.changes
,每次更改name
时都会发出一个值当您编写
person.name = 'Fred'
时,将调用setter,而setter将从Observable中发出新值 .为什么你需要你的孩子知道这个变化?在您的孩子中,您应该只更改与孩子相关的事物并将其冒泡到父母身上 . 使用Observables,孩子仍然可以更容易地显示信息 . 我建议使用@Output然后更改父对象
如果使用getter,每次给出一个值时都会执行setter . 因此,解决方法可以有两个变量
所以,在你的父母,你可以写
每次更改时, Another option 都在服务中使用EventEmitter