javascript - $.Callbacks Angular 替代方案或管理许多回调的方法

标签 javascript jquery angularjs

jquery $.Callbacks 的 Angular 有替代方案吗?我想要一种简单的方法来管理 Angular 回调列表。我想以 Angular 执行以下操作:

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/

如果 Angular 中没有替代方案,那么 Lodash、Underscore 或任何其他横切框架中是否有替代方案?也许我可以用 promise 做类似的事情,有什么想法吗?但我不想这样做 then().then(),因为我会在不同的地方订阅该事件,例如在 Controller 中的 a 指令中。

我正在寻找一种明确且易于遵循的方法,以在不同的位置(例如 $.Callbacks)订阅事件,但以 Angular 方式订阅事件,而无需依赖 jquery。

例如,当许多对象订阅同一事件时,pubsub 就不容易遵循。而且我不知道有什么方法/技术可以在许多带有 promise 的对象中订阅同一事件。

最佳答案

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>

关于javascript - $.Callbacks Angular 替代方案或管理许多回调的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29145382/

相关文章:

javascript - 在不使用 GTM dataLayer 的情况下触发自定义事件以激活 Google 优化

javascript - 如何更改邮寄时传输的值?

javascript - 遍历列表并在 jquery 中获取选中的复选框 ID

javascript - jQuery datetimepicker 插件范围错误

javascript - 没有路线的 Angular 应用程序

javascript - npm left-pad 的取消发布是如何破坏代码的?

javascript - 如何在正则表达式搜索中使用正斜杠?

javascript - Angular 数据绑定(bind) - 手动设置模型值

angularjs - 如何在自定义指令中设置 ng-model-options?

javascript - 选项卡样式灵感无法与 4 个选项卡一起正常工作