使用 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 后端。不过,这需要做更多的工作,我个人认为这不值得付出努力。您最终会以更人为的方式做几乎相同的事情,但如果您还打算通过同一个插件处理删除和更新数据,它可能会更干净。
我需要用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 后端。不过,这需要做更多的工作,我个人认为这不值得付出努力。您最终会以更人为的方式做几乎相同的事情,但如果您还打算通过同一个插件处理删除和更新数据,它可能会更干净。