UPDATE:我進一步簡化了錯誤案例並在SignalR的GitHub頁面上提出了一個問題。您可以在這裏看到問題:https://github.com/SignalR/SignalR/issues/1828。其實這個bug與AngularJS無關。替換SignalR回調不起作用
我有一個項目,在後端和AngularJS上使用ASP.NET和SignalR作爲前端。一切工作正常,除非我在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'];
在我這個控制器首先訪問中,我可以發送和接收消息,我所有的角綁定做工精細。我的控制檯有輸出:
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消息仍然進入第一個回調,該回調具有前一個控制器實例的$範圍,因此我的視圖不會更新最新的消息。
這是爲什麼?爲什麼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);
});
};
[?Signalr(1.0.0-α-2)集線器 - 您可以添加客戶端功能連接啓動後]的可能重複(http://stackoverflow.com /問題/ 13497390/signalr-1-0-0-α-樞紐,可以任您添加客戶端,功能,售後服務,連接了) – 2013-04-05 12:54:13