Backbone.js 包含空格的属性名称上的主干更改事件

Backbone.js 包含空格的属性名称上的主干更改事件,backbone.js,backbone-events,Backbone.js,Backbone Events,如何为此属性名称添加事件:Lorem Ipsum 我试过了 this.model.on("change:Lorem Ipsum") 但它给了我两件事: 更改:Lorem Ipsum LoremIpsum必须告诉我一个字 this.model.on(“change:LoremIpsum”,YourFunction)正如您在注释中所指出的,文档中指出,由于事件接受以空格分隔的事件列表,因此属性名称不应包含空格。1 但是,如果您愿意在主干网的未来版本如何处理这一问题上冒一些风险,请深入主干网源代码

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

我试过了

this.model.on("change:Lorem Ipsum")
但它给了我两件事:

  • 更改:Lorem
  • Ipsum

LoremIpsum必须告诉我一个字


this.model.on(“change:LoremIpsum”,YourFunction)

正如您在注释中所指出的,文档中指出,由于事件接受以空格分隔的事件列表,因此属性名称不应包含空格。1

但是,如果您愿意在主干网的未来版本如何处理这一问题上冒一些风险,请深入主干网源代码并损害您的理智,您可以覆盖模型上的
事件
机制:

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;
    }
});
请参见演示


1

好的。。刚刚在文档中发现:“由于事件接受以空格分隔的事件列表,因此属性名称不应包含空格。”它们确实应该将以空格分隔的事件列表更改为以逗号分隔的:(+你只是不能用这样的名称命名属性,你会得到语法错误是的,我可以。我现在正在使用它。不,你不能-你会得到语法错误SyntaxError:missing:在属性id之后。你可以打开控制台并签出这个,或者检查这个小提琴-我不使用默认值。我已经用了2/3个月了。这是我第一次使用它属性名问题出现了。另外,我没有使用get或set方法,因为我有一个嵌套(有点复杂)的模型。无论如何,谢谢:)哇,非常感谢!这太棒了!我现在明白了,使用包含空格的属性不是最佳做法。一些内置函数将不起作用。正如用户所说,默认函数将给出语法错误。我不会使用您的实现,这确实有点冒险,我找到了一个更安全的解决方案。再次感谢教授一些关于主干网的源代码:)是的。谢谢:)如果他们能在下一个版本中更改,那就太好了!
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');