2013-05-03 26 views
2

在骨干模型中,是否可以在初始化函数中为嵌套视图触发事件?我将这个例子的当前代码作为基础: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当模型改变时调用,但不是在初始化时。 “更改”事件按预期工作(调用this.render)。有什么想法吗?

谢谢!

回答

0

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

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

+0

哦 - 我明白你在说什么 - 我知道这很简单。我试着听收集'添加'事件 - 但最终有一些意想不到的行为。仔细观察一下,看看发生了什么(每当我向集合中添加模型时,集合中的每个模型都会调用“add”事件)。 – ururk 2013-05-03 03:36:16

1

我目前正面临类似的问题。我需要在我的模型的初始化方法中触发change事件。 我看着骨干代码显露为什么这是不会发生:

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

相关问题