【问题标题】:Is it possible to trigger an event when initializing a model?初始化模型时是否可以触发事件?
【发布时间】:2013-05-03 00:03:11
【问题描述】:

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

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)。有什么想法吗?

谢谢!

【问题讨论】:

    标签: backbone.js backbone-events


    【解决方案1】:

    我目前面临着类似的问题。我需要在模型的初始化方法中触发更改事件。 我查看了主干代码,它揭示了为什么没有发生这种情况:

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

    setinitializethis.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 设置为当前属性。

    【讨论】:

      【解决方案2】:

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

      您可能希望将事件处理移至Backbone.Collection,该Backbone.Collection 已经内置了您可以监听以添加/删除的事件。

      【讨论】:

      • 哦 - 我明白你在说什么 - 我知道这很简单。我尝试收听集合“添加”事件 - 但最终出现了一些意外行为。将仔细观察以了解发生了什么(每次我向集合中添加模型时,都会为集合中的每个模型调用“添加”事件)。
      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2015-06-11
      • 2023-03-21
      相关资源
      最近更新 更多