Templates 基于推送检测策略的模板数据绑定
我得到了两个组件:列表和项目,并使用Templates 基于推送检测策略的模板数据绑定,templates,angular,Templates,Angular,我得到了两个组件:列表和项目,并使用为列表设置项目渲染器: <chat-message-list [messages]="messages | async"> <template> <chat-message [isTimestampVisible]="isTimestampVisible | async"></chat-message> </te
为列表设置项目渲染器:
<chat-message-list [messages]="messages | async">
<template>
<chat-message [isTimestampVisible]="isTimestampVisible | async"></chat-message>
</template>
</chat-message-list>
列表和消息都使用推送检测策略(ChangeDetectionStrategy.OnPush
)
在我使用
设置项目渲染器之前,isTimestampVisible
属性已正确绑定。当我使用
时,属性在更改后不再刷新。我不想使用默认检测策略,因为我使用React得到了不可变的模型
当我将
传递给
而不是布尔值时,它工作正常,但是
是我的“哑”组件,所以它不应该接收可观察值-只是纯值
如果将ChangeDetectionStrategy.OnPush
更改为ChangeDetectionStrategy.Default
在消息列表中。ts
绑定正在工作。使用OnPush
组件仅在您调用它或输入更改时运行更改检测
我刚刚在
中添加了一个输入,并传递了isTimestampVisible
,使其在每次isTimestampVisible
更改时都更新
使用OnPush
仅当您调用该组件或当输入发生更改时,该组件才会运行更改检测
我刚刚在
中添加了一个输入,并传递了isTimestampVisible
,使其在每次isTimestampVisible
更改时都更新
当您将组件更改为默认的ChangeDetectionStrategy
时,它是否工作?是的,但如果没有模板,它甚至可以使用ChangeDetectionStrategy.OnPush
。无模板数据通过列表传递:MyComponent->MessageList->Message我想这需要一个Plunker来复制和调试。我添加了一个Plunker示例。如果将ChangeDetectionStrategy.on更改为ChangeDetectionStrategy.Default
在消息列表中。ts
绑定正在工作。此外,如果您删除模板并在消息列表中使用消息组件,则它将与变更检测策略一起工作。当您将组件更改为默认值变更检测策略时,OnPush是否起作用?是,但如果没有模板,它甚至可以使用ChangeDetectionStrategy.OnPush
。无模板数据通过列表传递:MyComponent->MessageList->Message我想这需要一个Plunker来复制和调试。我添加了一个Plunker示例。如果将ChangeDetectionStrategy.on更改为ChangeDetectionStrategy.Default
在消息列表中。ts
绑定正在工作。此外,如果您删除模板并在消息列表中使用消息组件,则它将与ChangeDetectionStrategy一起工作。OnPush
是,但我想将数据直接传递给消息组件。您的实现看起来像是解决方法。如果我想通过列表组件传递数据,我可以在没有模板的情况下完成。这不是传递数据,而是通知列表它需要更新。好的,我明白,我想如果我直接将数据传递给消息,它将被更新。您可以将任何值传递给[update]
(只需与前一个不同)。使用OnPush
在输入更改时运行更改检测。您可以通过任何其他方式调用更改检测cdRef.detectChanges()
…但它需要被调用。最简单的方法是传递isTimestampVisible
,因为它总是在组件需要更新时更新;-)当然,但它仍然是我的一个解决方法,这样的代码不容易读取。是的,但我想将数据直接传递给消息组件。您的实现看起来像是解决方法。如果我想通过列表组件传递数据,我可以在没有模板的情况下完成。这不是传递数据,而是通知列表它需要更新。好的,我明白,我想如果我直接将数据传递给消息,它将被更新。您可以将任何值传递给[update]
(只需与前一个不同)。使用OnPush
在输入更改时运行更改检测。您可以通过任何其他方式调用更改检测cdRef.detectChanges()
…但它需要被调用。最简单的方法是传递isTimestampVisible
,因为它总是在组件需要更新时更新;-)当然,但它看起来仍然是我的一个解决方法,这样的代码不容易阅读。