2017-01-10 3 views
0

私は変数を持っています - isTelephoneMenuOpen私のメニューを開くようにします。 ウィンドウ内の他の場所をクリックすると消えてしまいます。 私はこのコードを試みたが、イベントハンドラ内のそのworking.Pleaseない助け

$document.on('click', function (event) { 
 
     if (this.isTelephoneMenuOpen = true) { 
 
      console.log("close menu"); 
 
      this.isTelephoneMenuOpen = false; 
 
      // return $document.off('click', event); 
 
     } 
 
});

+0

すべてが同じコントローラにあることに注意してください –

+0

これはAngularJSの使用方法ではありません。 'ng-show'と' ng-if'と 'ng-click'を確認してください – Weedoze

+0

あなたの状態は値を比較していて、それを比較していません。それはいつも「真実」と評価されます – casraf

答えて

1

thisキーワードがイベントを発光素子ではなく、親関数のthisコンテキストにバインドします。親コンテキストthisを変数に明示的にバインドします。

var $ctrl = this; 

    $document.on('click', menuClickHandler); 

    this.$onDestroy = function() { 
     $document.off('click', menuClickHandler); 
    }; 

    function menuClickHandler(event) { 
     if ($ctrl.isTelephoneMenuOpen) { 
      console.log("close menu"); 
      $ctrl.isTelephoneMenuOpen = false; 
      $rootScope.$apply(); 
     } 
    } 

クリックイベントは、AngularJSフレームワーク外からのものです。 $ applyを使用してAngularJSダイジェストサイクルを開始し、DOMを更新します。

からAngularJS Developer Guide (v1.1) - Concepts - Runtime

+0

非常に良い説明ですが、一つの発言ですが、バインディングを再評価する範囲を消化する方がはるかに優れています'$ rootScope。$ apply()'を使ってすべての要素について完全なダイジェストを強制します。 –

+0

あなたは '$ digest'と' $ apply'を混同していると思います。 '$ apply'は式関数を実行し、' root。$ digest'を開始します。実際にどのスコープから開始されるかは問題ではありません。 – georgeawg

+0

私の主張は、現在のスコープで '$ digest'を呼び出すのではなく、' $ apply'がルートで呼び出す方が良いということです。 –

関連する問題