2016-08-29 11 views
0

私のアプリでは、私はboradcastingなんらかの値をチェックしながら特定のポイントのイベントです。それはうまく動作しますが、問題は、後で私がbroadcastをトリガーしているときはいつでも、私の条件が働いている、つまり、私の状態がtriggerのhappendの後に常に働いていることを意味します。 、あなたはロジックを切り替えたい場合は

var myWatch = scope.$watch('ctrl.data.deviceCity', function(){ 
      if(someCondition === true){ 
       myWatch(); //deregister the watcher by calling its reference 
      } 
    }); 

ちょうどいくつかを設定します。あなたは変数にその参照を格納し、それを呼び出すことによって、ウォッチャの登録を取り消すことができ

scope.$watch('ctrl.data.deviceCity', function(newcity, oldcity) { 

    if (!newcity) { 
     scope.preloadMsg = false; 
     return; 
    } 

    scope.$on('cfpLoadingBar:started', function() { 
     $timeout(function() { 
      if (newcity && newcity.originalObject.stateId) { //the condition not works after the first time means alwasy appends the text 
       console.log('each time'); 

       $('#loading-bar-spinner').find('.spinner-icon span') 
        .text('Finding install sites...'); 
      } 
     }, 100); 
    }); 
}); 
+0

あなたの説明は何もないようです表示するコードを使用します。何が起きているのかもう少し詳しく説明できますか?また、ctrl.data.deviceCityが変更されるたびに、 'cfpLoadingBar:started'の新しいeventListenerが作成されることに注意してください。したがって、 'deviceCity'を10回変更すると、突然console.logを実行してそのスピナーのテキストを変更する10ドルのタイムアウトが発生すると想像してください。 – vileRaisin

+0

基本的には、テキストを1回だけ表示する必要があります。それは都市が変わる時を意味します。その後、私はテキストを表示する必要はありません。私はそれを削除する必要があります – 3gwebtrain

答えて

1

:ここ

は私のコードです変数のどこかでメソッドの制御フローを指示します:

var myWatch = scope.$watch('ctrl.data.deviceCity', function(){ 
    scope.calledOnce = false; 

    if(!scope.calledOnce){ 
     //... run this the first time 
     scope.calledOnce = true; 
    } 
    else { 
     // run this the second time (and every other time if you do not deregister this watch or change the variable) 
     // if you don't need this $watch anymore afterwards, just deregister it like so: 
     myWatch(); 
    } 
}) 
+0

良い考え、私を試してみましょう.. – 3gwebtrain

関連する問題