包含空格的属性名称上的骨干更改事件

时间:2014-07-07 09:21:28

标签: backbone.js backbone-events

如何为此属性名称添加事件:Lorem Ipsum

我试过

this.model.on("change:Lorem Ipsum")

但它给了我两个事件:

  • 更改:Lorem
  • 存有

2 个答案:

答案 0 :(得分:2)

正如您在评论中所述,文档声明由于事件接受空格分隔的事件列表,因此属性名称不应包含空格。 1 < / p>

但是,如果您愿意承担Backbone的未来版本将如何处理此问题的风险,请深入研究Backbone源代码并损害您的理智,您可以覆盖模型上的Events机制:

var M = Backbone.Model.extend({
    on: function(name, callback, context) {
        if (name!=='change:Lorem Ipsum') {
            return Backbone.Model.prototype.on.call(this,name, callback, context);
        }

        this._events = this._events || {};
        this._events[name] = this._events[name] || [];
        this._events[name].push({
            callback: callback, 
            context: context, 
            ctx: context || this
        });
        return this;
    },
    trigger: function(name) {
        if (name!=='change:Lorem Ipsum') {
            return Backbone.Model.prototype.trigger.apply(this, arguments);
        }

        var events = this._events && this._events[name];
        if (!events) return this;
        var ev, i = -1, l = events.length, args = [].slice.call(arguments, 1);

        while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);        
        // I skipped the all event

        return this;
    }
});

这个想法是根据事件模块的当前实现自己处理事件的注册和发布。如果需要,您还必须修改其他方法。

设置Lorem Ipsum属性将作为&#34;预期&#34;:

var m = new M();
m.on("change", function(model) {
     console.log('change', model.changedAttributes());
});
m.on("change:Lorem Ipsum", function(model) {
    console.log('change:Lorem Ipsum', model.changedAttributes());
});

m.set('Lorem Ipsum', 'dolor sit amet');

请参阅http://jsfiddle.net/nikoshr/44m7L/了解演示

1 http://backbonejs.org/#Model-attributes

答案 1 :(得分:0)

LoremIpsum必须说一句话。

this.model.on(&#34;更改:LoremIpsum&#34;,YourFunction)