初始化模型时是否可以触发事件?

时间:2013-05-03 00:03:12

标签: backbone.js backbone-events

在骨干模型中,是否可以在初始化函数中触发嵌套视图中的事件?我根据此示例创建了当前代码:https://stackoverflow.com/a/8523075/2345124并更新了主干1.0.0。这是我的初始化函数,对于Model:

var Edit = Backbone.Model.extend({
    initialize: function() {
        this.trigger('marquee:add');

        this.on('change', function(){
            this.trigger('marquee:add');
        });
    }
    ...
}

我正在尝试在模型初始化时调用方法renderMarquee:

var EditRow = Backbone.View.extend({
    initialize: function() {
        this.listenTo(this.model, "change", this.render);   // works
        this.listenTo(this.model, "marquee:add", this.renderMarquee);  // only called when changed, but not when initially created
    ...
}

在更改模型时调用renderMarquee IS ,但在初始化时不调用。 'change'事件按预期工作(this.render被调用)。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

我目前面临类似的问题。我需要在模型的initialize方法中触发change事件。 我查看了骨干代码,揭示了为什么没有发生这种情况:

var Model = Backbone.Model = function(attributes, options) {
    ...
    this.set(attrs, options);
    this.changed = {};
    this.initialize.apply(this, arguments); 
  };

setinitialize清空之前执行this.change,将模型状态设置为“没有任何变化”。

为了覆盖行为,我将以下代码添加到初始化方法中。

initialize: function(attributes, options) {
  ...
  this.changed = attributes;
  this.trigger('change');
  for (attr_name in attributes) {
    this.trigger('change:' + attr_name);
  }
},

我手动触发所有更改事件,这对我很重要,因为继承模型可能会绑定到changechange:attrxy。但这还不够,因为如果我只是触发事件,changedAttributes()方法将返回false,因此我还将this.changed设置为当前属性。

答案 1 :(得分:0)

这没有多大意义,因为您在进行view.listenTo调用之前正在初始化模型。不幸的是,你真的没有选择。

您可能希望将事件处理移至已经内置事件的Backbone.Collection,您可以收听这些事件以进行添加/删除。