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
,因为它总是在组件需要更新时更新;-)当然,但它看起来仍然是我的一个解决方法,这样的代码不容易阅读。