【发布时间】:2020-04-07 12:18:02
【问题描述】:
我有一个 Angular MatTable,它显示来自 websocket 的事件。我想更新 DOM 并跟上来自套接字的事件,这些事件每秒可能超过 100 条消息。我相信 Angular 虚拟 DOM 跟不上,而是每秒强制刷新几次。为了正确显示 websocket 提要的效果,我需要跟上数据(无论它多么难以辨认)。
在下面的代码中,我通过 RxJS WebSocketSubject 接收消息,这些消息被推送到 serverMessages。我只显示最近的 10 条消息。
export class FeedComponent {
public serverMessages: Message[] = [{type: "application", data: "Connecting to message stream"}];
public displayedColumns: string[] = ['type', 'data'];
private socket$: WebSocketSubject<Message>;
constructor(private detectorRef: ChangeDetectorRef) {
this.socket$ = new WebSocketSubject(`ws://${env.gatewayHost}/api/liveupdates`);
this.socket$
.subscribe(
(message) => {
this.serverMessages.push(message)
if(this.serverMessages.length > 9) this.serverMessages.shift()
this.serverMessages = [...this.serverMessages]
},
(err) => console.error(err),
() => console.warn('Completed!')
);
this.socket$.next({type: "filter", data: "*"});
}
}
MatTable 是这个的正确选择吗?我应该只用原始 TypeScript 修改 DOM 吗?有没有办法用每条消息强制刷新 DOM 或提高速率?
【问题讨论】:
标签: angular typescript rxjs angular6 virtual-dom