2016-11-08 2 views
-1

ich ein Modul wie das gerade geschrieben:Über die Verwendung von `this` in Javascript

(function(){ 
    'use strict'; 
    angular.module('myApp.dashboard').controller('mainControl',mainControl); 

    mainControl.$inject = ['whichToShow','authService']; 
    function mainControl(whichToShow,authService){ 
     var self=this; 
     this.values=whichToShow.getVar(); 
     this.logOut=function(){ 
      whichToShow.setVar(false); 
      authService.logOutUser(); 
     }; 
     this.removeEvent=function(eventId){ 
      authService.removeEvent(eventId); 
     } 

     authService.setOnAuth(authDataCallback); 
     // Callback to set user's events. 
     function authDataCallback(authData) { 
      if (authData) { 
       console.log("User is logged in with " + authData.email); 
       self.eventList={}; 
       whichToShow.setVar(true); 
      } else { 
       console.log("User is logged out"); 
      } 
     } 
    } 
})(); 

In diesem Modul die Leitung self.eventList={};, zunächst nur this.eventList={} verwende ich, sagt die Konsole mir TypeError: Cannot set property 'eventList' of undefined die ganze Zeit.

Bis ich self als this festlegen und self in der AuthDataCallback-Funktion verwenden. Ich finde es schließlich heraus, wie man es löst, weiß aber nicht, warum das ist? Kannst du es mir sagen?

+0

können Sie bitte Ihren Service veröffentlichen? – qchap

+0

Es hat alles mit dem Geltungsbereich zu tun - Ihre 'authDataCallback()' Methode wird von einem anderen Bereich aufgerufen, also ist 'das' nicht mehr das, was Sie dachten, dass es sein sollte. Wenn 'self = this' gesetzt wird, bevor' authDataCallback() 'aufgerufen wird, können Sie auf den ursprünglichen Bereich zugreifen. – arthurakay

+2

Es gibt eine Million gute Ressourcen zu 'diesem' - aber das erste Google-Suchergebnis, das ich auf SO gefunden habe, war: http://StackOverflow.com/Questions/3127429/how-does-the-this-keyword-work – arthurakay

Antwort

1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

Das this Schlüsselwort in JS ist kontextspezifisch. Ihr Callback hat seinen eigenen Ausführungskontext, so dass sich this auf diesen Kontext bezieht und nicht in den umgebenden Kontext schaut.

Wenn Sie dies nicht einer Variablen zuweisen und die Variable puling verwenden, können Sie .bind(this) verwenden, um sie im Kontext der Funktion zu verwenden, oder Sie beginnen mit ES6 Fettpfeilfunktionen.