2016-03-24 23 views
0

Ich habe eine AngularJS-Direktive, die eine Fabrik verwendet. Was ich versuche zu erreichen, ist sicherzustellen, dass, wenn das "mousedown" -Ereignis in der Direktive ausgelöst wird, dann eine Funktion in meiner Fabrik aufgerufen wird.AngularJS Factory-Ereignisbindung

Scheint einfach, aber wo ich auf ein Problem stoße ist in der Funktion in der Fabrik. Es hat keinen Zugriff auf meine Variablen, die in der Factory deklariert wurden.

Beispiel zum mousedown- Ereignisse in meiner Richtlinie verbindlich -

$element.on('mousedown', factory.onMouseDown);

Beispiel meiner Fabrik und die Funktion, die durch meine Richtlinie genannt wird -

angular.module('myApp.myFactory', []).factory('myFactory', [, function() { 
 
    var myFactory = function() { 
 
     this.someVariable = true; 
 
    }; 
 

 
    myFactory.prototype.onMouseDown = function (e) 
 
    { 
 
     console.log(this.someVariable); // this.someVariable comes up as 'undefined' 
 
    }; 
 

 
    return myFactory; 
 
}]);

Was muss ich tun, um meine Fu zu machen? um in meiner Fabrik auf Variablen zugreifen zu können?

Danke!

Antwort

1

Mit der Annahme, dass myFactory eine „Klasse“ ist die Simulation und das factory Variable enthält ein durch myFactory instanzierte Objekt gibt es es viele Ansätze zu lösen:

(1) Die Bindung ein Objekt als Kontext :

$element.on('mousedown', factory.onMouseDown.bind(factory)); 

(2) einen Verschluss Verwenden des factory Referenz zu erhalten:

wenn Rückruf Argumente sind bekannt:

$element.on('mousedown', function (evt) { 
    factory.onMouseDown(evt); 
}); 

wenn Rückruf Argumente nicht bekannt sind:

$element.on('mousedown', function() { 
    factory.onMouseDown.apply(factory, arguments); 
}); 

(3) eine Konstruktor Funktion mit privilegierten Methoden anstelle den Prototyp Eigenschaft der Verwendung:

angular.module('myApp.myFactory', []).factory('myFactory', function() { 
    var myFactory = function() { 
     var self = this; 
     self.someVariable = true; 
     self.onMouseDown = function (e) { 
      console.log(self.someVariable); 
     }; 
    }; 

    return myFactory; 
}); 
0

Wenn die Funktion korrekt ausgelöst wird, fehlt es meiner Meinung nach an dem, was von der Factory myFactory zurückgegeben wird. Die Fabrik und die Dienstleistungen im Winkel wirken wie ein Verschluss, so dass Sie die Variable einfach in der Fabrik deklarieren können und die Funktion zurückgeben können, da sie Zugriff darauf hat.

angular.module('myApp.myFactory', []).factory('myFactory', [function() { var someVariable = "asdkhdsfhkhlskadfhadsflk"; var myFactory = { mouseDownEvent: function(e){ console.log(someVariable); } } return myFactory; }]);