【问题标题】:Signalr callbacks are run outside angular zone?Signalr 回调在角度区域之外运行?
【发布时间】:2022-05-02 00:29:58
【问题描述】:

我对信号器和角度有一个奇怪的问题。我们最近升级了 signalr 以使用 @microsoft/signalr 包而不是 @aspnet/signalr 包,我们注意到 signalr 调用的回调不再在角度区域中运行。

重要的代码位:

 // connection is of type HubConnection
public async onUpdateJobInfo(callback: (jobInfo: JobInfo) => void): Promise<void> {
        return this.connection.on('someInvokedMethod', callback);
    }

 // Register the callback
this.jobHub.onUpdateJobInfo((jobInfo: JobInfo) => this.updateJobInfo(jobInfo));

// Process the callback 
private updateJobInfo(jobInfo: JobInfo): void {
        console.log('update jobservice in zone: ', NgZone.isInAngularZone());
        
    }

日志 (update jobservice in zone: false) 表明我们没有在 angular zone 中运行回调,因此更改检测无法按预期工作。当使用与旧信号器类似的设置时,代码按预期在角度区域中运行。这是最近已知的变化吗?如何最好地应对这种情况?用 zone.run() 语句封装所有内容?

感谢您的帮助!

【问题讨论】:

    标签: angular signalr zonejs


    【解决方案1】:

    我们也开始遇到 Angular 不呈现更改的问题(因此我们必须调用 detectChanges 方法)。 它是在升级 signalr 包后开始的,但不是从 @aspnet/signalr 升级到 @microsoft/signalr。

    我们已经有 @microsoft/signalr .NET 5.0 (microsoft/signalr@5.0.14) 这很好,但升级到 @microsoft/signalr .NET 6.0(例如 microsoft/signalr@6.0.2)会启动 Angular 屏幕更新问题。

    我们不得不降级回 5.0.14。

    【讨论】:

    • 您是否使用@microsoft/signalr .NET 6.0 找到了解决此问题的方法?谢谢。 @sander-dechamps
    • 我们通过为我们的集线器创建一个基类来“解决”它,该基类包装了 'connection.on' 方法并强制回调进入区域 ("@microsoft/signalr": "^6.0.0 -preview.3.21201.13"): protected on(method: string, callback: (...args: any[]) =&gt; void): void { return this.connection.on(method, this.callbackHandler.bind({zone: this.zone, callback})); } private callbackHandler(...args: any[]): void { if(this.zone) { this.zone.run(() =&gt; { (this as any).callback(...args); }); } else { (this as any).callback(...args); } }
    猜你喜欢
    • 2019-01-06
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多