在侦听器附加到Backbone.Model事件时获取通知

Chr*_*gel 3 javascript events backbone.js

我想知道它是否可能以某种方式通知Backbone模型一个侦听器已经附加到某个事件,因此它可以通过做一些初始化过程来做出反应.

我问,因为我有一个案例,其中一些事件需要太多昂贵的预处理才能让数据可用于触发没人听的事件.

使用Backbone Event系统是否可行,或者我是否必须覆盖on()方法?

Naz*_*zar 5

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

_.extend(Backbone.Model.prototype, {

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

});
Run Code Online (Sandbox Code Playgroud)

所以我们不会覆盖"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
});
Run Code Online (Sandbox Code Playgroud)

但是新方法会让你感到困惑.所以我们有能力覆盖所有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);
        }

    }

});
Run Code Online (Sandbox Code Playgroud)

大!现在我们可以编写非常好的代码:

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
});
Run Code Online (Sandbox Code Playgroud)

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