Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 使用Collection.reset时重写Model.parse_Backbone.js - Fatal编程技术网

Backbone.js 使用Collection.reset时重写Model.parse

Backbone.js 使用Collection.reset时重写Model.parse,backbone.js,Backbone.js,我需要使用Model.parse来更改传入JSON的结构;我还需要使用collection.reset(我们从插件中提取数据,而不是直接从服务器中提取数据)将数据输入到我的集合中。经过大量的努力,在我看来,parse仅在使用Collection.fetch时调用,而不是在使用reset传递数据或将JSON直接输入到集合构造函数()时调用 是否有某种方法可以强制主干网将原始模型对象传递给解析,以便在所有情况下向其提供新数据? 现在,在将原始对象模型传递给reset之前,我在一个单独的函数中处理它,

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

是否有某种方法可以强制主干网将原始模型对象传递给
解析
,以便在所有情况下向其提供新数据?


现在,在将原始对象模型传递给
reset
之前,我在一个单独的函数中处理它,虽然这确实有效,但我发现这是一个非常不令人满意的解决方案。我对主干网也非常陌生,所以我有点怀疑我只是误解了
解析
/
重置
/
获取

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

从理论上讲,你的变通方法听起来并没有那么糟糕。我这样做的方式是通过underline.js
map
函数运行我想要放入集合中的数据,我认为这非常适合这个用例

考虑一下本文中的代码

有一个
MyModel
和一个
parse
函数,以及两种重置为该模型创建的集合的方法。第二种方法使用
\uuu.map
,而不只是传递原始数据。该函数获取一个数组和一个函数引用,并返回一个新数组,其中包含由第二个参数转换的输入函数的对象,在本例中,该函数是模型的
解析


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

我想这只是在某种纯粹的层面上让我感到困扰。主干组织得很好,我喜欢不必打破范式的想法。不过,好消息。谢谢你的回答@SandyGifford我认为覆盖Sync是最纯粹的方式,因为Sync首先要被覆盖。如果你从中获取数据的插件是通用的,你甚至可以把它做成主干插件(比如)。我想这确实更纯粹,但正如您从该插件的github repo中看到的,它需要更多的代码。如果没有其他东西的话,这将是一个很好的主干.Sync如何工作的练习。我完全同意,但是(说这句话让我很难受)考虑到这个项目的范围,我不认为我可以以令人满意的、令人敬畏的代码的名义证明这么多工作是合理的。话虽如此,我想我稍后会回到这里,以实现我将来可以使用的东西。
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'));