2016-03-24 7 views
0

У меня есть директива AngularJS, в которой используется фабрика. То, что я пытаюсь достичь, заключается в том, что когда событие «mousedown» в директиве запускается, тогда на моей фабрике вызывается функция.AngularJS Factory Event Binding

Похоже на то, что я столкнулся с проблемой в функции на заводе. Он не имеет доступа ни к одной из моих переменных, которые были объявлены на заводе.

Пример привязки к MouseDown событие в моей директиве -

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

Пример моей фабрики и функции, которая вызывается моей директивы -

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; 
 
}]);

Что мне нужно сделать для моего фу чтобы иметь доступ к переменным на моей фабрике?

Спасибо!

ответ

1

В предположении, что myFactory является имитирующей «класс» и переменная factory содержит объект инстанцированный по myFactory существует множество подходов для решения его:

(1) Связывание объекта в контексте :

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

(2) с помощью закрытия, чтобы сохранить factory ссылка:

если аргументы обратного вызова известны:

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

если аргументы обратного вызова не известны:

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

(3) С помощью функции конструктора с привилегированными методами, вместо того, чтобы использовать свойство прототипа:

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

Если функция запускается правильно, то, что я думаю, что вам не хватает, является то, что возвращается фабрикой myFactory. Фабрика и сервисы в угловом режиме действуют как замыкание, поэтому вы можете просто объявить переменную на заводе и вернуть функцию, так как она имеет к ней доступ.

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