2016-03-27 2 views
0

Ich versuche eine Aktion auszuführen, wenn ein Benutzer scrollt, jedoch kann ich nicht auf den Bereich des Controllers zugreifen.

Mein Code ist:

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

      this.sidebarFixed = false; 

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

Der Ausgang dieses ist undefined. Wie kann ich innerhalb der Funktion auf this zugreifen?

Antwort

2

Der Kontext this innerhalb des Event-Handler ist nicht die Steuerung ... es ist window denn das ist, was $window Referenzen

Versuchen Bezug von Controller this in Variablen gespeichert und die Verwendung dieser in den Event-Handler.

Ihr Problem ist häufig auftretendes Problem this in Javascript mit so Referenz Speicherung ist immer eine gute Praxis

(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

Dank. Wenn ich jedoch den Wert ändere, wird es in der Ansicht nicht aktualisiert. Wie kann ich das beheben? – rj93

+0

Ich habe $ scope in meinen Controller injiziert und '$ scope. $ Apply()' aufgerufen und es aktualisiert nun die Ansicht, ist das der richtige Weg? – rj93

+0

Da das Ereignis außerhalb des eckigen Kontextes auftritt, müssen Sie angle benachrichtigen, um einen Digest auszuführen. In den meisten Fällen kann '$ apply()' verwendet werden, aber da ein scroll-Ereignis passieren kann, ist es oft am besten, '$ timeout' zu verwenden – charlietfl