我需要使用Model.parse
来更改传入JSON的结构;我还需要使用Collection.reset
将数据提供到我的集合中(我们从插件中提取数据,而不是直接从服务器提取数据)。经过大量的努力,在我看来parse
仅在使用Collection.fetch
时调用,而不是在使用reset
传递数据时或在将JSON直接提供给集合构造函数时调用( the documentation appears to agree)。
对于所有向其提供新数据的情况,是否有某种方法可以强制Backbone将原始模型对象传递给parse
?
现在我在将原始对象模型传递给reset
之前在单独的函数中进行处理,虽然这确实有效,但我发现它是一个非常不令人满意的解决方案。我也非常对Backbone不熟悉,所以我只是在怀疑我只是误解了parse
/ reset
/ fetch
之间的关系。 / p>
答案 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后端。虽然这项工作有点多,但我个人并不认为它真的值得付出努力。你最后做的几乎是同样的事情,但是以一种更人为的方式,但是如果你还要通过同一个插件来处理删除和更新数据,它可能更干净。