2013-04-05 53 views
0

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); 
    }); 
}; 
+0

[?Signalr(1.0.0-α-2)集線器 - 您可以添加客戶端功能連接啓動後]的可能重複(http://stackoverflow.com /問題/ 13497390/signalr-1-0-0-α-樞紐,可以任您添加客戶端,功能,售後服務,連接了) – 2013-04-05 12:54:13

回答