首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Backbone.js中的嵌套模型,如何处理

Backbone.js中的嵌套模型,如何处理
EN

Stack Overflow用户
提问于 2011-06-30 21:59:43
回答 12查看 55.9K关注 0票数 118

我已经从服务器获得了以下JSON。这样,我想创建一个带有嵌套模型的模型。我不确定哪一种是实现这一点的方法。

代码语言:javascript
复制
//json
[{
    name : "example",
    layout : {
        x : 100,
        y : 100,
    }
}]

我希望将这些转换为具有以下结构的两个嵌套主干模型:

代码语言:javascript
复制
// structure
Image
    Layout
...

所以我这样定义布局模型:

代码语言:javascript
复制
var Layout = Backbone.Model.extend({});

但是,我应该使用下面两种(如果有的话)技术中的哪一种来定义Image模型呢?下面是A还是B?

A

代码语言:javascript
复制
var Image = Backbone.Model.extend({
    initialize: function() {
        this.set({ 'layout' : new Layout(this.get('layout')) })
    }
});

或者,B

代码语言:javascript
复制
var Image = Backbone.Model.extend({
    initialize: function() {
        this.layout = new Layout( this.get('layout') );
    }
});
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-03-28 17:40:38

我在写我的主干应用程序时也遇到了同样的问题。必须处理嵌入式/嵌套模型。我做了一些调整,我认为这是一个相当优雅的解决方案。

是的,您可以修改解析方法来更改对象中的属性,但所有这些实际上都是很难维护的代码,而且感觉更像是一个hack而不是一个解决方案。

以下是我对您的示例的建议:

首先像这样定义你的布局模型。

代码语言:javascript
复制
var layoutModel = Backbone.Model.extend({});

然后这是你的图像模型:

代码语言:javascript
复制
var imageModel = Backbone.Model.extend({

    model: {
        layout: layoutModel,
    },

    parse: function(response){
        for(var key in this.model)
        {
            var embeddedClass = this.model[key];
            var embeddedData = response[key];
            response[key] = new embeddedClass(embeddedData, {parse:true});
        }
        return response;
    }
});

请注意,我并没有篡改模型本身,只是从parse方法传回了所需的对象。

当您从服务器读取数据时,这应该可以确保嵌套模型的结构。现在,您会注意到,保存或设置实际上没有在这里处理,因为我觉得使用适当的模型显式地设置嵌套模型对您来说是有意义的。

如下所示:

代码语言:javascript
复制
image.set({layout : new Layout({x: 100, y: 100})})

还要注意,您实际上是通过调用以下命令来调用嵌套模型中的parse方法:

代码语言:javascript
复制
new embeddedClass(embeddedData, {parse:true});

您可以根据需要在model字段中定义任意多个嵌套模型。

当然,如果您想要将嵌套模型保存在它自己的表中。这是不够的。但是在读取和保存整个对象的情况下,这种解决方案应该足够了。

票数 99
EN

Stack Overflow用户

发布于 2011-11-23 15:46:16

我把这段代码作为Peter Lyon建议重新定义解析的一个例子。我也有同样的问题,这对我很有效(使用Rails后端)。这段代码是用Coffeescript编写的。我为不熟悉它的人做了一些明确的事情。

代码语言:javascript
复制
class AppName.Collections.PostsCollection extends Backbone.Collection
  model: AppName.Models.Post

  url: '/posts'

  ...

  # parse: redefined to allow for nested models
  parse: (response) ->  # function definition
     # convert each comment attribute into a CommentsCollection
    if _.isArray response
      _.each response, (obj) ->
        obj.comments = new AppName.Collections.CommentsCollection obj.comments
    else
      response.comments = new AppName.Collections.CommentsCollection response.comments

    return response

或者在JS中

代码语言:javascript
复制
parse: function(response) {
  if (_.isArray(response)) {
    return _.each(response, function(obj) {
      return obj.comments = new AppName.Collections.CommentsCollection(obj.comments);
    });
  } else {
    response.comments = new AppName.Collections.CommentsCollection(response.comments);
  }
  return response;
};
票数 16
EN

Stack Overflow用户

发布于 2012-09-23 12:08:24

使用Backbone-associations中的Backbone.AssociatedModel

代码语言:javascript
复制
    var Layout = Backbone.AssociatedModel.extend({
        defaults : {
            x : 0,
            y : 0
        }
    });
    var Image = Backbone.AssociatedModel.extend({
        relations : [
            type: Backbone.One,
            key : 'layout',
            relatedModel : Layout          
        ],
        defaults : {
            name : '',
            layout : null
        }
    });
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6535948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档