使用 Collection.reset 时覆盖 Model.parse

Overriding Model.parse When Using Collection.reset

我需要用Model.parse改变传入的结构JSON;我还需要使用 Collection.reset 将数据馈送到我的集合中(我们从插件中提取数据,而不是直接从服务器中提取数据)。经过大量努力,在我看来 parse 仅在使用 Collection.fetch 时调用,而不是在使用 reset 传递数据或将 JSON 直接输入时调用集合构造函数 (the documentation appears to agree).

是否有某种方法可以强制 Backbone 将原始模型对象传递给 parse,以应对所有向其提供新数据的情况?

现在我在将原始对象模型传递给 reset 之前在一个单独的函数中处理它,虽然这确实有效,但我发现它是一个非常不令人满意的解决方案。我也是 难以置信 Backbone 的新手,所以我有点怀疑我只是误解了 parse/reset/ 之间的关系fetch.

是的,reset 的目的是用完全成熟的模型或原始模型属性哈希加载 collection,这就是 parse 未被调用的原因。

从理论上讲,您的解决方法对我来说并没有那么糟糕。我这样做的方法是 运行 我想通过 underscore.js map 函数放入 collection 的数据,我认为这非常适合这个用例.

考虑此 plnkr

中的代码
var MyModel = Backbone.Model.extend({

    parse: function(data) {
      return {
        text: data.text.toUpperCase() 
      }
    }

});

var MyCollection = Backbone.Collection.extend({

  model: MyModel

});

var collection = new MyCollection();

var arr = [
  { text: 'abc' },
  { text: 'cde' }
];


collection.reset(arr);
console.log(collection.pluck('text'));

collection.reset(_.map(arr, MyModel.prototype.parse));
console.log(collection.pluck('text'));

有一个具有 parse 功能的 MyModel,以及为该型号制作的 collection 的两种重置方法。第二种方法使用 _.map 而不是只传递原始数据。 map 函数采用一个数组和一个函数引用,returns 一个新数组,其中包含由第二个参数转换的输入函数的 objects,在本例中,该函数是模型的 parse.

如果您仍然不喜欢该语法,您可以尝试提供自定义 Sync 以便它直接与您从中获取数据的插件对话,而不是使用 REST 后端。不过,这需要做更多的工作,我个人认为这不值得付出努力。您最终会以更人为的方式做几乎相同的事情,但如果您还打算通过同一个插件处理删除和更新数据,它可能会更干净。