AngularJS工厂事件绑定

时间:2016-03-24 17:04:12

标签: angularjs

我有一个使用工厂的AngularJS指令。我努力实现的目标是确保当“躲避”时触发指令中的事件,然后调用我工厂中的函数。

看起来很简单,然而,我遇到的问题是在工厂的功能中。它无法访问我在工厂中声明的任何变量。

在我的指令中绑定到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;
}]);




为了让我的函数能够在工厂中访问变量,我需要做些什么?

谢谢!

2 个答案:

答案 0 :(得分: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)使用具有特权方法的构造函数而不是使用prototype属性:

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

答案 1 :(得分:0)

如果函数正确触发,我认为你缺少的是myFactory工厂返回的内容。角度的工厂和服务就像一个闭包,所以你可以在工厂中声明变量并让函数返回它,因为它可以访问它。

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