更新: エラー ケースをさらに単純化し、SignalR の GitHub ページに問題を提出しました。ここで問題を確認できます: https://github.com/SignalR/SignalR/issues/1828。実はこのバグは 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
したがって、コントローラーの2番目の作成時に最初のコールバックが置き換えられないため、私のバインディングは更新されません。すべての 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);
});
};