我对Angular很陌生,我想了解一些东西。
我有一个我们保留的项目:
changeDetection: ChangeDetectionStrategy.OnPush
因此,如果我想保留changeDetection onPush
,应该如何解决此问题:
我在视图中有一个对象列表,当您将鼠标悬停在一个对象上时,有一个(mouseover)
函数将next()
发送到BehaviourSubject
,我订阅了该函数以获取悬停的对象。
如果我将带有此订阅的控制台日志放在控制台中,则将鼠标悬停在控制台中时,我将看到更新的对象。
但是,如果我的组件中包含以下内容:
...
hoveredObject: ObjectType;
ngOnInit() {
mySubscription.subscribe(s => {
this.hoveredObject = s;
});
}
...
在这种情况下,只会在视图上显示我悬停的第一个值,而不会在我悬停的另一个值上显示,如果我删除了onPush changeDetection
,该值将得到固定。
但是如何在不删除的情况下克服它? 我了解这是因为该对象是参考,因此未检测到更改, 我尝试过类似的事情:
mySubscription.subscribe(s => {
this.hoveredObject = {
id: s.id,
name: s.name
};
但是它不起作用,并且我收到错误消息,无法读取undefined
的名称,这是因为最初当您不将鼠标悬停在任何内容上时,BehaviourSubject
会返回undefined
如何使Angular知道这里有更改并更新视图?
在该视图中,我有一个div:{{hoveredObject}}
谢谢
答案 0 :(得分:3)
仅当我们在谈论父/子组件通信时,OnPush才有意义。当孩子具有changeDetection时:ChangeDetectionStrategy.OnPush设置,并且父母将对象作为输入传递给孩子。
如果要处理具有自己状态的组件中的事件。最好避免使用onPush。如果要使用,可以使用cdr.markforCheck()手动调用更改检测。