首先,我刚开始尝试将SignalR 2添加到现有的Angular SPA项目中.
我有一个主控制器,它立即启动集线器,向客户端发送一些消息.在里面,我有几个子页面,每个子页面都可以订阅不同的服务中心.问题是客户端没有收到消息,因为它已在主控制器中已启动集线器后连接.
作为测试,如果我在主控制器中注释出集线器启动,则子控制器中的集线器工作正常.
根据我的阅读,您需要在启动集线器之前连接所有客户端调用.我不明白……如果它是一项服务,我应该可以在集线器启动后随时订阅或取消订阅.为什么不?如何解决?
因为在12个小时内没有反应(这是非常不寻常的),我不得不四处挖掘自己.我想,在开始连接之前你必须订阅所有客户呼叫的相关问题的答案我被误导了,如上所述,例如
here.我发现在
Hubs API Guide,一节说
原文链接:https://www.f2er.com/angularjs/240411.htmlDefine method on client (without the generated proxy,or when adding
after calling the start method)
因此,可以在连接开始后添加客户端方法.诀窍是使用所谓的“没有生成代理”.该限制适用于“使用生成的代理”.
以下是我从SignalR入门教程中获取的工作示例.
这是使用“with generated proxy”的主控制器:
$.connection.statusHub.client.updateStatus = function (status) { $scope.status = status; $scope.$apply(); } $.connection.hub.start();
这是在使用“without generated proxy”的子控制器中:
var connection = $.hubConnection(); var proxy = connection.createHubProxy('stockTickerHub'); proxy.on('updateStockPrice',function (stock) { var st = $scope.stocks.firstOfKey(stock.symbol,'symbol'); st.lastPrice = stock.lastPrice; $scope.$apply(); }); var hub = $.connection.stockTickerHub; connection.start().done(function () { hub.server.getAllStocks().done(function (stocks) { $scope.stocks = stocks; }); });
请注意,如果我在子控制器中使用“with generated proxy”,它不起作用,如下所示:
var hub = $.connection.stockTickerHub; hub.client.updateStockPrice = function (stock) { var st = $scope.stocks.firstOfKey(stock.symbol,'symbol'); st.lastPrice = stock.lastPrice; $scope.$apply(); }; $.connection.hub.start().done(function () { hub.server.getAllStocks().done(function (stocks) { $scope.stocks = stocks; }); });
为了证明“使用生成的代理”模式的限制,如果我在主控制器中注释掉该代码,则此代码有效.
顺便说一句,我对指南中有或没有生成代理的术语感到困惑,在这两种情况下,它仍然被称为xxxProxy.难道他们找不到更好的名字?或者有人有解释?