0

更新: エラー ケースをさらに単純化し、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);
    });
};
4

1 に答える 1

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?でソリューションを確認できます。

于 2013-04-05T12:53:52.683 に答える