使用Collection.reset时覆盖Model.parse

时间:2015-03-23 22:58:02

标签: backbone.js

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

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

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

1 个答案:

答案 0 :(得分:2)

是的,reset的目的是使用完全成熟的模型或原始模型属性哈希来加载集合,这就是为什么不调用parse的原因。

从理论上讲,你的解决方法对我来说并不是那么糟糕。我这样做的方法是通过underscore.js map函数运行我想要放入集合中的数据,这在我看来非常适合这个用例。

考虑此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'));

其中MyModel具有parse功能,以及两种重置为该模型制作的集合的方法。第二种方法使用_.map而不是仅传递原始数据。 map函数接受一个数组和一个函数引用,并返回一个新数组,该数组包含由第二个参数转换的输入函数的对象,在这种情况下,该函数是模型的parse

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