当鼠标不在浏览器文档中时,Angular2 不会从 SignalR 处理程序更新组件

标签 angular signalr

所以我有一个在 Angular2 中开发的应用程序。它所做的其中一件事是从 SignalR 接收事件并更新浏览器中的数据。

当我在使用 Angular 初学者工具包的开发场景下运行时,它一直运行良好。

现在我正在使用 angular-cli 来捆绑应用程序,它仍然可以部分工作,但似乎有什么地方坏了。如果在收到 SignalR 事件时鼠标不在浏览器的文档窗口内,则不会发生 DOM 更新。即使鼠标位于浏览器的地址栏或选项卡上,它仍然不会更新。我可以在控制台窗口中看到日志,显示事件已收到且数据已更新,但 View 未更新。

我假设那里发生了某种性能问题,但我认为就我而言,性能与使用 SystemJS 时一样好,除了整个下载 200 个 js 文件的事情:)

我需要做些什么来触发 SignalR 事件的更新,或者我可以做些什么来获得我以前得到的相同行为, View 会自动更新,即使我专注于另一个应用程序?

更新:我发现如果我在 NgZone.run block 中运行 SignalR 处理程序内部的代码,它就可以工作。这可能已经足够好了,但如果我能让它像在原始开发环境中那样工作就更好了。

最佳答案

我有完全相同的问题。我猜测要么是 Angular 2 没有猴子修补 WebSocket,要么是 signalR 使用了一些非标准的 API。

就像对@Gerald 所做的那样,NgZone.run 也对我有用。

@Igor Lizunov,这是使用 NgZone.run() 的方法

导入ZgZone

import { NgZone } from '@angular/core';

注入(inject)构造函数

constructor(private zone: NgZone)

在 signalR 处理程序中运行 ZgZone

hub.on("signalr-event-name", data => {
    /*do something with the data*/
    this.zone.run(() => { });
});

关于当鼠标不在浏览器文档中时,Angular2 不会从 SignalR 处理程序更新组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40580175/

相关文章:

angular - 未捕获( promise ): ChunkLoadError: Loading chunk xxx-xxx-module failed. Angular 9

angular - 如何将 @Input 与使用 ComponentFactoryResolver 创建的组件一起使用?

redis - SignalR.Redis 是如何工作的?

javascript - $scope.$apply 未在页面刷新时更新

java - 未从 SignalR hub 接收任何数据

.net - 在 IIS7 中配置时 SignalR 聊天不起作用 - Windows 7

angular - 从 Amazon S3 下载图像 : Frontend or Backend

javascript - rxjs 订阅 onerror 绑定(bind)

具有 ASP.NET Web API 验证的 Angular 2

azure - Azure 应用程序服务中的 Signalr 不适用于 WebSockets