【问题标题】:Backbone.js: Raise model change event after fetching the collection?Backbone.js:获取集合后引发模型更改事件?
【发布时间】:2012-06-14 10:01:28
【问题描述】:

我有一个带有 name 属性的模型,该模型具有在属性更改时调用的绑定函数:

var Workitem = Backbone.Model.extend({
                                 initialize: function(){
                                 this.bind('change:name', function() {
                                           alert('name');
                                           }
                                           });
                                 },
                                 defaults: {
                                 name: 'Name'
                                 }
                                 });

如果我获取单个模型,这会起作用,并且当我设置属性和获取数据时会触发更改事件。

然后我创建了一个集合,我希望在 fetch 方法期间为每个提取的模型触发事件到集合中:

var WorkitemList = Backbone.Collection.extend({
                                       model: Workitem,
                                       });

var workitemsList = new WorkitemList();
workitemsList.fetch();

这可能吗?

【问题讨论】:

  • 您是否为集合和模型设置了 url,或者这些值只是从某个地方神奇地出现?
  • 嗨,Jakee,我使用的是backbone.localStorage.js,所以当我执行提取时,数据是从HTML5 本地存储中读取的,但我认为这与我的问题无关。当我对单个模型(存储在 localStorage 中)执行相同操作时,会在获取后触发更改事件,但如果模型是集合项,则此操作不起作用

标签: backbone.js


【解决方案1】:

导入完成后,Fetch 会触发集合上的“重置”事件。听着,然后开火/弄乱模型。

【讨论】:

    【解决方案2】:

    获取集合会用服务器响应替换集合中的模型。它不会更新集合中的每个模型,这是您想要的。最简单的解决方法是遍历集合以获取每个模型但是随后您对服务器有多个请求并且错过了任何新添加的模型..

    我认为对于您想要实现的目标,您需要创建并获取您的集合的另一个实例,然后将其中的模型与您的原始集合进行比较并根据需要进行更新.. 不是很漂亮..

    【讨论】:

    • 您好 Lecstor,感谢您的回答。我试图在 fetch() 方法之后循环到模型来解决你的问题,但这不起作用(警报返回零而不是获取的项目数):var WorkitemList = Backbone.Collection.extend({ model : Workitem, initialize : function() { this.fetch({ success : alert(this.length) }); } });
    • 我觉得应该更像..var WorkitemList = Backbone.Collection.extend({ model : Workitem, initialize : function() { this.fetch({ success : function(collection, response){ alert(collection.length) }}); } });
    【解决方案3】:

    您可以覆盖集合的fetch-函数以单独调用每个模型的 fetch。但这是非常暴力的。

    fetch: function() {
      for (var model: this.models) {
        model.fetch();
      }
    }
    

    谁有更好的方法来完成这个?

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2012-07-08
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多