1

我有一个 Backbone 应用程序,我从服务器获得的 JSON 与我希望模型的外观不完全是一对一的。我为我的模型使用自定义解析函数,例如:

parse: function(response) {
   var content = {};
   content.id = response.mediaId;
   content.image = response.image.url;
   return content;
}

这行得通。但是,在某些情况下,我有一个 API 调用,我可以在其中一次获取大量信息,例如,有关带有userand的图像的信息comments

{
    "mediaId": "1",
    "image": {
        "title": "myImage",
        "url": "http://image.com/234.jpg"
    },
    "user": {
        "username": "John"
    },
    "comments": [
        {
            "title": "Nice pic!"
        },
        {
            "title": "Great stuff."
        }
    ]
}

我将如何从这里创建一个新的用户模型和一个评论集合?这是一个选项:

parse: function(response) {
   var content = {};
   content.id = response.mediaId;
   content.image = response.image.url;
   content.user = new User(response.user);
   content.comments = new Comments(response.comments);
   return content;
}

这里的问题是,通过创建一个new Usernew Comments使用原始 JSON 作为输入,Backbone 只会将 JSON 属性添加为属性。相反,我希望有一个类似中间parse的方法来控制对象的结构。以下是一个选项:

parse: function(response) {
    // ...
    content.user = new User({
        username: response.user.username
    });
    // ...
}

...但这不是很防干。

所以,我的问题是:用 1 个 JSON 响应创建多个模型/集合并控制模型/集合属性的好模式是什么?

谢谢!

4

1 回答 1

1

这可能不是最好的方法,但这就是我的做法:

content.user = new User(User.prototype.parse(response.user));

唯一的问题是this上下文User.parse是错误的。如果您在构造函数中没有任何特定代码User,您也可以这样做:

content.user = new User();
content.user.set(user.parse(response.user));

我还注意到 Backbone 版本 0.9.9 更改日志中的一个有趣的注释:

parse 函数现在总是在定义后运行,对于集合和模型——不仅仅是在 Ajax 调用之后。

并查看ModelCollection构造函数的源代码,他们这样做:

if (options && options.parse) attrs = this.parse(attrs);

也许升级到 0.9.9 会给你你需要的东西?如果升级不是一个选项,您当然可以在自己的构造函数中实现相同的功能。

于 2012-12-14T12:51:01.830 回答