我想知道是否有可能以某种方式通知 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/