【问题标题】:AngularJS + Signalr not connecting to hub when controller is in a ng-include当控制器位于 ng-include 中时,AngularJS + Signalr 未连接到集线器
【发布时间】:2014-06-26 14:12:41
【问题描述】:

当控制器位于 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 中的控制器无法使用该服务?

【问题讨论】:

  • 无耻插件,你可以看看这个:github.com/roylee0704/angular-signalr

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


【解决方案1】:

我认为您可能有 2 个不同的问题:

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

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

【讨论】:

  • 感谢您的回复。这是两个不同的问题。第一个 .on 处理程序必须在调用 start 之前定义。是的,这很奇怪,因为它在 index.html 中工作。
  • 由于 ngInclude 引入了一个新的隔离作用域,我的控制器中的事件监听器不会接收到从服务发出的任何消息。我个人尽量避免使用 $broadcast,因为这可能存在性能问题,而是使用 $rootScope 作为事件总线。这是一个link,用于测试 $emit 与 $broadcast
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 2021-03-23
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
相关资源
最近更新 更多