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

时间:2013-10-29 20:15:27

标签: javascript events backbone.js

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

我问,因为我有一个案例,其中某些事件需要进行过多昂贵的预处理才能使数据可用于触发无人监听的事件。

Backbone Event系统是否可以实现,或者我是否必须覆盖on()方法?

1 个答案:

答案 0 :(得分:5)

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

_.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/