当控制器在“内部”包含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内的控制器无法使用该服务?
答案 0 :(得分:0)
我认为你可能有两个不同的问题:
.on
之前在SignalR代理上定义你的.start()
处理程序,这应该有助于解决OnConnected
服务器端缺少的调用(听起来很奇怪,我知道,但是试试) ngInclude
引入了一个独立的范围,因此您有一个更多级别的范围,这可能会引入一个问题。此外,为了从父级到子级范围发送事件,您应该使用$broadcast
(检查here)两者都是我看到的第一印象,你可能想尝试,但我没有做任何测试......