1

複数の状態 (ルート) を持つ Angular JS アプリケーションを、バックエンドで実行されているノード サーバー (ソケット) に接続しています。他の状態を訪れて、ソケット コードが記述されている状態に戻ると、再び登録され、イベントが発生すると関数が複数回呼び出され、パフォーマンスに影響します。

 var socket = io.connect('127.0.0.1:3000');

        socket.on("connect",function(){
          console.log("connected");
        });


          socket.on("test-channel:App\\Events\\NewMessage", function(message) {
              if (vm.questions.length < 3) {

                  console.log("question fetching started");
                  vm.fetch_q();

              }
          });

io.connect('localhost') もサービスに入れて、イベントのみをコントローラーに入れてみましたが、それも複数回発生しています。

4

1 に答える 1

0

問題は、コントローラーにアクセスするたびにコントローラーが「on」イベントを設定し、更新時にのみ削除されないことです。

AngularJS を使用する場合は、単純に宣言し$rootScope.socket = io.connect('127.0.0.1:3000');て、このようにコントローラで使用できます。これ$rootScope.socket.emit('event', {});は、イベントをリッスンしたいがoninsted of を使用する場合と同じ方法ですemit

とにかく、これはパフォーマンスとプログラムの開発方法を向上させる方法ですが、イベントリスナーをコントローラーに保持するのはあまり良くないため、質問の問題はまだ残っています-何かを発行する場合のみ。

この問題は、AngularJS Run サービスのイベント リスナーを使用して解決できます。

app.run(function($rootScope){
  $rootScope.socket.on('event', function(){
    // Do something..
  });
}

また、リッスンするイベントがさらにある場合は、モジュールでイベントを宣言してから、モジュールのrunサービスを要求できます。あなたにとって良い解決策になることを願っています。

于 2018-01-13T14:12:23.563 に答える