2016-03-27 6 views
0

ユーザーがスクロールしたときにアクションを実行しようとしていますが、コントローラのスコープにアクセスできません。

私のコードは次のとおりです。

(function() { 
    angular.module("myApp") 
     .controller("MyController", ['$window', function($window){ 

      this.sidebarFixed = false; 

      angular.element($window).bind("scroll", function() { 
       console.log(this.sidebarFixed); 
      }); 
    }]); 
})(); 

これの出力はundefinedです。どのように機能内のthisにアクセスできますか?

答えて

2

イベントハンドラ内thisの文脈はそれが$window参照

が変数にコントローラthisの参照を格納し、イベントハンドラ内であることを使用してみてくださいものですので、それはwindowです...コントローラではありません。

あなたの問題はそれほど参照を格納することは常に良い習慣

(function() { 
    angular.module("myApp") 
     .controller("MyController", ['$window', function($window){ 
      var vm = this; // store reference then always use variable 
      vm.sidebarFixed = false; 

      angular.element($window).bind("scroll", function() { 
       // `this` is `window` here 
       console.log(vm.sidebarFixed); 
      }); 
    }]); 
})(); 
+0

おかげで、JavaScriptでthisを使用して共通の問題です。ただし、値を変更するとビューでは更新されません。どうすれば修正できますか? – rj93

+0

私のコントローラに$ scopeを注入し、 '$ scope。$ apply()'を呼び出してビューを更新しました。これは正しい方法ですか? – rj93

+0

スコープを更新した場合にイベントが角度コンテキスト外で発生するため、ダイジェストを実行するにはangleを通知する必要があります。ほとんどの場合、 '$ apply()'を使うことができますが、スクロールイベントは '$ timeout'を使うのが一番良いでしょう。 – charlietfl

関連する問題