backbone.js - 使用parse而不调用fetch

boo*_*ean 16 javascript backbone.js

在页面加载时,我通过这种技术将我的数据引导到我的集合中.这很好用,但是我遇到了一个问题,我有子模型也需要进行投射.

例如,我返回一个名为Book的JSON集合,每个book数组包含10-20个自称为Pages的模型.如果我尝试直接访问Pages,我会收到[object][object]错误,因为Backbone无法确定它是什么类型的对象.

以前在我使用时fetch,我会通过使用包含parse动作的集合来解决这个问题.在parse我会做这样的事情:

Collection_Books = Backbone.Collection.extend({
    model: Model_Book,
    parse: function (response) {
        response.Pages = new Collection_Pages(response.Pages);
        return response;
    }
});
Run Code Online (Sandbox Code Playgroud)

现在我正在直接访问数据而不使用fetch,文档意味着我不再能够访问该parse方法.

如果我fetch在页面加载时没有使用或调用服务器,我如何使用Books> Pages示例来转换子模型?

ugl*_*nky 57

不确定这是否是新的,但看起来你也可以只将parse构造函数的options参数的属性设置为true,从而告诉构造函数使用你的parse方法:

modelInstance = new MyModel(obj, {parse: true});
Run Code Online (Sandbox Code Playgroud)

http://backbonejs.org/#Model-constructor

  • 这个答案不适用于调用Collections解析,只能调用每个Model的解析.你会想到`new Collection_Books(json,{parse:true});`会调用`YourCollection.prototype.parse`但它没有.所以这个答案是不正确的. (5认同)

mu *_*ort 11

更新:这个答案现已过时,请参阅uglymunky的答案,了解更多最新信息.


你说得对,parse唯一指定的被称为中fetch,这样就不会被当你建立从原始数据收集调用.

但是,由于您控制了用于引导集合的原始数据,因此您可以parse自己调用集合:

var c = new YourCollection(
    YourCollection.prototype.parse([
        // attribute data goes here...
    ])
);
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/kdaZ3/

你的parse方法(集合和模型)不应该关心它们的调用上下文,所以直接从原型调用它们应该没问题.