私のAngularJSアプリには、次の単純化された動作があります。
というファクトリを持つサービスモジュールを作成しましたserver
。このserver
モジュールは、websocket サーバーへの通信を処理します。この websocket 接続内でイベントが発生したときに、点滅するメッセージを my MainController
.
私のサービス:
return function init() {
ws = new WebSocket(...);
ws.onopen(function () {
$rootScope.$broadcast("flash", "websocket connected");
});
};
私の見解:
<article ng-controller=MainController ng-init=init()>
<section ng-show="flash.length > 0">
<p ng-repeat="message in flash">
{{ message }}
</p>
<section>
<section ng-view>
...
</article>
私のコントローラー:
function MainController ($rootScope, $scope, server) {
$scope.init = function () {
$scope.flash = [];
server.init();
};
$scope.on("flash", function (event, flash) {
$scope.flash.push(flash);
// $scope.$apply("$scope.flash"); <-- if I uncomment this line, I get the error...
console.debug($scope.flash[$scope.flash.length -1]);
});
};
このコードを実行すると、websocket 接続でデバッグ メッセージが表示されますが、flash
配列への変更は、fe ボタンをクリックするか関数を呼び出した場合にのみ適用されます$apply
。後者の場合、「適用がすでに進行中です」というエラーが発生します。いくつかの調査の後、への呼び出しは必要ないと確信しています$apply
。
flash
では、変更についてすぐにビューに通知する方法で配列を変更するにはどうすればよいでしょうか?