当控制器处于ng-include时,AngularJS + Signalr无法连接到集线器

时间:2014-06-26 14:12:41

标签: javascript asp.net angularjs signalr signalr-hub

当控制器在“内部”包含ng-include时,我遇到一个从控制器连接到集线器的奇怪问题。

服务:

angular.module('app').service('signalRSvc', function($, $rootScope) {
var proxy = null;

var initialize = function() {
    var connection = $.hubConnection();
    proxy = connection.createHubProxy('myHub');

    connection.start();

    proxy.on('srvMessage', function(data) {
        $rootScope.$emit('newMessage', data);
    });
}

return {
    initialize: initialize
};
});

控制器:

function MyController($scope, signalRSvc) {

signalRSvc.initialize();

var vm = this;

vm.message = '';

$scope.$parent.$on("newMessage", function (e, data) {
    $scope.$apply(function () {
        vm.mesage = data;
    });
});
}

Index.html(剥离):

<div data-ng-controller="MyController as vm">
    Server message {{vm.message}}
</div>
<div data-ng-controller="LoginController as vm">
    Server message 2: {{vm.message}}
</div>
<div data-ng-include="'app/layout/shell.html'"></div> 

和Shell.html:

<div data-ng-controller="MyController as vm">
    Server message {{vm.message}}
</div>

调试此服务我的服务初始化被触发三次,但服务器端OnConnect仅被触发两次。向服务器发送消息,Index.html中的控制器会更新,但shell中的控制器不会更新。如果我从Index.html中删除控制器,我会得到1个初始化和0个OnConnect服务器端。

但是,如果我放弃使用服务并将以下代码放入控制器内,它将获得3个连接并更新所有控制器:

var hub = $.hubConnection();
var proxy = hub.createHubProxy('myHub');

proxy.on('newMessage', function(data) {
    $scope.$apply(function() {
        vm.message = data;
    });
});

hub.start().done(function () { });

之前是否有其他人看过这个或者可以解释为什么ng-incude内的控制器无法使用该服务?

1 个答案:

答案 0 :(得分:0)

我认为你可能有两个不同的问题:

  • 你应该在调用.on之前在SignalR代理上定义你的.start()处理程序,这应该有助于解决OnConnected服务器端缺少的调用(听起来很奇怪,我知道,但是试试)
  • ngInclude引入了一个独立的范围,因此您有一个更多级别的范围,这可能会引入一个问题。此外,为了从父级到子级范围发送事件,您应该使用$broadcast(检查here

两者都是我看到的第一印象,你可能想尝试,但我没有做任何测试......