3

我想知道是否有可能以某种方式通知主干模型监听器已附加到某个事件,以便它可以通过执行一些初始化过程来做出反应。

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

使用 Backbone Event 系统是否有可能,还是我必须重写 on() 方法?

4

1 回答 1

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/

于 2013-10-29T22:43:29.443 回答