【问题标题】:Angular render on new data新数据的角度渲染
【发布时间】:2017-10-04 16:16:31
【问题描述】:

我已经用 Angular 实现了一个简单的聊天应用程序。我正在使用来自@stomp/ng2-stompjs 的 stomp 套接字。我正在使用*ngFor 来显示所有消息。

<p *ngFor="let item of messages" style="padding: 5px; font-size: 18px">
    <span style="color:darkturquoise">{{item.author}}</span>: {{item.message}}
  </p>

但是当messages 变量更新时(我可以看到console.log),angular 不会重新渲染*ngFor。

this.subscription = this.messagesObs.subscribe((message: Frame) => {
  this.messages = <ResponseMessage[]>JSON.parse(message.body).slice();
  console.log(this.messages);
});

我试过this.changeDetector.detectChanges();,但没有帮助。 我知道这是框架的默认行为,但是有什么好的方法可以让*ngFor 在每次订阅后呈现?

更新:

我做了一个plunker 的例子。示例将不起作用,因为我的后端位于 localhost 上。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    您可以使用 rxjs map 运算符和 angular 中的 async-pipe 来订阅您的数据。如果组件被销毁,管道也会确保订阅被清除。

    public messages$: Observable<ResponseMessage[]> = this.messagesObs.map((message: Frame) => {
      return JSON.parse(message.body) as ResponseMessage[];
    });
    

    在你的组件视图中:

    <p *ngFor="let item of messages$ | async" style="padding: 5px; font-size: 18px">
      <span style="color:darkturquoise">{{item.author}}</span>: {{item.message}}
    </p>
    

    【讨论】:

    • 这只是部分工作。当我发送消息时,数据会来(在控制台中查看)但 ngFor 没有呈现..只有当我开始输入另一条消息时......
    • 您的messagesObs 看起来如何?您是否使用onPush 作为变更检测策略?
    • this pastebin.com/gQbUb26h is my .component.ts this pastebin.com/YDN179F7 is my .html 我试过 OnPush 但没有帮助:)
    • 我查看了组件和 ng2-stomp 服务 api 文档,这个应该可以工作:pastebin。
    • 它和我的一样:) ...没有帮助
    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 2015-08-06
    • 2023-03-12
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多