我正在尝试将我的SignalR代码与angular集成。我跟着,也许,5个不同的教程,但无法让它工作。
Following this tutorial,我的代码唯一的区别是我的app.js 文件如下所示:
var myApp = angular.module('myApp', []);
$(function () {
$.connection.hub.url = server;
$.connection.hub.logging = true;
$.connection.hub.start().done(function () {
console.log('Hub connection open. ID: ' + $.connection.hub.id);
});
});
angular.module('myApp').value('chat', $.connection.testhub);
,教程app.js如下所示:
(function() {
angular.module('myApp', [])
$(function () {
$.connection.hub.url = server;
$.connection.hub.logging = true;
$.connection.hub.start().done(function () {
console.log('Hub connection open. ID: ' + $.connection.hub.id);
});
});
angular.module('myApp').value('chat', $.connection.testhub);
});
当从控制器访问“聊天”服务时,我可以控制台.log我的集线器。 但SignalR日志表示连接开始在订阅任何集线器之前发生,因此当然没有调用客户端方法。
所以我的问题是,我们的app.js文件的区别是这个问题的原因吗?为什么?
其他一切都是一样的,我已经确认SignalR服务器正常工作。
答案 0 :(得分:0)
您需要对在done
回调触发之前触发的任何请求进行排队。
我已经为SignalR创建了一个抽象库,我像这样解决了它
我还限制请求,以便在按顺序触发大量请求时将它们一起发送
你可以看看这个库,它的设计考虑了MVVM,也应该适合MVC https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki
答案 1 :(得分:0)
经过多次尝试但没有成功,我决定使用我的ApplicationController(所有控制器的父级)作为SignalR处理程序。从那里我可以订阅所有必要的集线器和广播事件到子范围来处理不同的需求。我确信这不是最好的做法,但对于我的小应用程序来说,这可能已经足够了。
myApp.controller('ApplicationController', ['$scope', 'logger', 'AuthService', function ($scope, logger, AuthService) {
$.connection.hub.url = serverUrl;
$.connection.hub.logging = true;
$.connection.testhub.client.getStaff = function (value) {
$scope.$broadcast('someEvent', value);
};
$.connection.hub.start().done(function () {
console.log('Hub connection open. ID: ' + $.connection.hub.id);
});
$.connection.hub.error(function (err) {
console.log("Error: " + err);
});
}]);
因此,我将广播以向下游发送事件并发出以将其从子控制器发送到父级。我想这会做到。