SignalR:如何在集线器启动后添加客户端呼叫?

时间:2014-09-20 04:14:12

标签: angularjs signalr

首先,我刚开始尝试将SignalR 2添加到现有的Angular SPA项目中。

我有一个主控制器,它立即启动集线器,向客户端发送一些消息。在里面,我有几个子页面,每个子页面都可以订阅不同的服务中心。问题是客户端没有收到消息,因为它已在主控制器中已启动集线器后连接。

作为测试,如果我在主控制器中注释出集线器启动,那么子控制器中的集线器工作正常。

从我读到的内容来看,您必须在启动集线器之前连接所有客户端调用。我不明白......如果它是一项服务,我应该可以在集线器启动后随时订阅或取消订阅。为什么不?如何解决?

1 个答案:

答案 0 :(得分:8)

因为在12小时内没有反应(这是非常不寻常的),所以我不得不四处寻找。我想,在开始连接之前你必须订阅所有客户呼叫的相关问题的答案我被误导了,如上所述,例如here。我在Hubs API Guide找到了一个部分说

  

在客户端上定义方法(没有生成的代理,或者在添加时)   在调用start方法之后)

因此,可以在连接启动后添加客户端方法。诀窍是使用所谓的“没有生成代理”。该限制适用于“使用生成的代理”。

以下是我从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;
    });
});

为了证明“with generated proxy”模式的限制,如果我在主控制器中注释掉该代码,则此代码有效。

顺便说一下,我对“指南”中有或没有生成代理的术语感到困惑,在这两种情况下,它仍然被称为xxxProxy。难道他们找不到更好的名字?或者有人有解释?