$ .Callbacks以角度替代或管理许多回调的方式

时间:2015-03-19 13:05:29

标签: javascript jquery angularjs

jquery $ .Callbacks的角度是否有替代品?我想要一个简单的方法来管理角度的回调列表。我想以角度执行以下操作:

function Broadcast(){
    var self= this;
    this._statusRecivedCallbacks = $.Callbacks();
    setTimeout(function () {
        self._statusRecivedCallbacks.fire('arg1', 'arg2');
    }, 500);
}

Broadcast.prototype.onStatusRecived = function(callback){
    if($.isFunction(callback)){ 
        this._statusRecivedCallbacks.add(callback);
    }
}

var broadObj = new Broadcast();

//subscribe to this for example in a controller
broadObj.onStatusRecived(function(arg1, arg2){
    alert('the argument 1 is: ' + arg1 + ' and the argumet 2 is: ' + arg2);
});

//subscribe to this for example in a directive
broadObj.onStatusRecived(function(arg1, arg2){
    alert("I'am suscribe too");
});

代码:http://jsfiddle.net/w0hmqbea/6/

如果没有角度的替代品,在lodash,下划线或任何其他横切框架中是否有替代品?也许我可以做任何与承诺类似的事情,任何想法?但我不想做then().then(),因为我会在不同的地方订阅该事件,例如在控制器和指令中。

我正在寻找一种明确的方式并且易于遵循,订阅不同地方的活动,例如$ .Callbacks,但是角度没有jquery依赖。

例如,当许多对象对同一事件有所影响时,pubsub并不容易理解。而且我不知道在许多具有承诺的对象中订阅相同事件的任何方式/技巧。

1 个答案:

答案 0 :(得分:1)

Angular没有针对PubSub实现的任何特定内容。就Promise而言,我认为将它们与$q服务所能提供的内容进行比较并不正确,因为它们有不同的用途。毕竟,Promise并不是取代PubSub的模式,它绝对不是关于事件和回调的。

如果您的目的是在没有jQuery的情况下编写更透明的PubSub模式版本,那么您可以使用纯Javascript执行类似的操作。

function Broadcast() {
    var self = this;
    this._statusRecivedCallbacks = [];
    setTimeout(function () {
        self.fire('arg1', 'arg2');
    }, 500);
}

Broadcast.prototype.onStatusRecived = function (callback) {
    if (angular.isFunction(callback)) {
        this._statusRecivedCallbacks.push(callback);
    }
}

Broadcast.prototype.fire = function() {
    var args = arguments ;
    this._statusRecivedCallbacks.forEach(function(callback) {
        callback.apply(null, args);
    });
};

var broadObj = new Broadcast();
broadObj.onStatusRecived(function (arg1, arg2) {
    console.log(arg1)
    alert('the argument 1 is: ' + arg1 + ' and the argumet 2 is: ' + arg2);
});

broadObj.onStatusRecived(function (arg1, arg2) {
    alert("I'am suscribe too");
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>