javascript - 当监听器已附加到 Backbone.Model 事件时获得通知

标签 javascript events backbone.js

我想知道是否有可能以某种方式通知 Backbone 模型监听器已附加到某个事件,以便它可以通过执行一些初始化过程使用react。

我在问,因为我有一个案例,有些事件需要太多昂贵的预处理,而只是让数据可用来触发一个没人听的事件。

Backbone Event 系统完全可以做到这一点,还是我必须重写 on() 方法?

最佳答案

有很多方法可以实现您的想法。 这是第一种简单的方法:

_.extend(Backbone.Model.prototype, {

    subscribe: function (name, callback, context) {
        this.on(name, callback, context);
        this.trigger('bind:' + name, callback, context);
    }

});

所以我们不会覆盖“on”方法。我们创建了自己的“订阅”方法。这是用法示例:

var Human = Backbone.Model.extend({

    initialize: function () {
        this.on('bind:change', function () {
            console.log('Someone started listening to "change" event');
        });
    }

});

var human = new Human({ name: 'Christian Engel' });

human.subscribe('change', function () {
    // do some stuff when a model's attributes have changed
});

但是新方法会让你感到困惑。所以我们有能力为所有 Backbone 模型覆盖“on”:

_.extend(Backbone.Model.prototype, {

    on: function (name, callback, context) {

        var eventSplitter   = /\s+/,
            eventBinder     = /bind:/;

        Backbone.Events.on.call(this, name, callback, context);

        if (!eventBinder.test(name) && !eventSplitter.test(name)) {
            this.trigger('bind:' + name, name, callback, context);
        }

    }

});

太棒了!现在我们可以写出漂亮的代码了​​:

var Human = Backbone.Model.extend({

    initialize: function () {
        this.on('bind:change', function () {
            console.log('Someone started listening to "change" event');
        });
    }

});

var human = new Human({ name: 'Christian Engel' });

human.on('change', function () {
    // do some stuff when a model's attributes have changed
});

这是现场演示/示例/测试: http://jsfiddle.net/gmAL3/1/

关于javascript - 当监听器已附加到 Backbone.Model 事件时获得通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19668210/

相关文章:

javascript - 在 TypeScript 中添加新属性 JSON

javascript - 从 data-* 属性获取 jquery 插件选项?

java - JFrame 在处理另一个事件时不响应事件

javascript - 如何对不同属性执行自定义主干排序?

javascript - 如果我使用 _.bindAll(this) 为什么我的 Backbone.View.constructor.__super__ 未定义

javascript - 主干不渲染 $el 但可以直接引用元素

javascript - 在 JavaScript 中绘制图像( Canvas )

javascript - 使用 JS/CSS 将元素堆叠在固定元素之上

c# - 侵入事件

javascript - 为什么检查 if preventDefault,然后 preventDefault?