更新:我进一步简化了错误案例,并在SignalR的GitHub页面上提出了问题。您可以在此处查看问题:https://github.com/SignalR/SignalR/issues/1828。实际上这个bug与AngularJS无关。
我有一个项目,它在后端使用ASP.NET和SignalR,而AngularJS作为前端。一切正常,除非我在AngularJS中移动并再次创建控制器,它们无法替换原始的SignalR回调方法。
以下是我的控制器的代码:
function SignalRProblemCtrl($scope) {
var bar = $.connection.bar;
$.connection.hub.start();
$scope.currentMessage = "";
$scope.messages = [];
$scope.messages.push("HELLO!");
var date = new Date();
bar.client.addMessage = function (message) {
$scope.$apply(function () {
console.log("Callback set on " + date + ": " + message);
$scope.messages.push(message);
});
};
$scope.send = function () {
bar.server.send($scope.currentMessage, "Extra data");
};
}
SignalRProblemCtrl.$inject = ['$scope'];
在我第一次访问此控制器时,我可以发送和接收消息,并且我的所有Angular绑定都可以正常工作。我的控制台有输出:
Callback set on Fri Apr 05 2013 14:37:13 GMT+0300 (E. Europe Daylight Time): First page load controllers.js:37
这一切都很好,花花公子。移动到另一个页面并再次访问SignalRProblemCtrl后出现问题。这次我可以发送和接收消息,消息被写入控制台但是我的绑定不会更新。控制台中的输出指向根本原因:
Callback set on Fri Apr 05 2013 14:37:13 GMT+0300 (E. Europe Daylight Time): Second page load controllers.js:37
因此我的绑定不会更新,因为在第二次创建控制器时,第一个回调不会被替换。所有SignalR消息仍然转到第一个回调,它具有前一个控制器实例的$ scope,因此我的视图不会使用最新消息进行更新。
这是为什么?为什么SignalR会保持第一个回调?
PS。我也试过立即替换回调。使用此代码,可以正确使用最新的回调(带有date2的回调)。
var date = new Date();
bar.client.addMessage = function (message) {
$scope.$apply(function () {
console.log("Callback set on " + date + ": " + message);
$scope.messages.push(message);
});
};
var date2 = new Date();
bar.client.addMessage = function (message) {
$scope.$apply(function () {
console.log("Callback set on " + date2 + ": " + message);
$scope.messages.push(message);
});
};
答案 0 :(得分:1)
在Github(https://github.com/SignalR/SignalR/issues/1828)提交问题后,我得到了关于如何解决这个问题的评论。
您可以在Signalr (1.0.0-alpha2) Hubs - Can you add client functions after connection has been started?
查看解决方案