初始化骨干关系后骨干模型过度使用

时间:2014-04-01 12:59:44

标签: javascript backbone.js backbone-relational

我有一个帐户的JSON响应,我将根据该响应创建 ModelA ,这将在用户中登录。

JSON响应为id,emailid,trackingid,gender,customurl,mobile,picture_url和plan id。

我还有一个JSON响应帖子,我正在创建 ModelB ,JSON响应为id,text,description,owner {id,customurl和picture url}。

我的ModelA作为这种关系

relations : [
  {
    type : Backbone.HasMany,
    key : 'posts',
    relatedModel : PostModel,
    collectionType : AccountPosts,
    reverseRelation : {
      type : Backbone.HasOne,
      key : 'account',
      keySource : 'owner',
      includeInJSON : false
    }
  }
]

我创建了ModelA的实例

currentUser = new ModelA()

和帖子的实例

post = new ModelB()

问题是当前用户和帖子所有者相同时, currentUser 属性被更改,即邮件所有者中不存在的emailid和其他属性将被删除。

我猜测骨干在内部创建了每个模型的引用,因为模型ID是相同的,第二个是覆盖第一个模型。

如果我的猜测正确,我怎样才能避免currentUser对象被覆盖?如果错误导致此问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

当您使用Backbone Relational reverseRelation 时,它会与Model及其relatedModel创建双向关系。如果你查看Backbone Relational页面上的Examples,他们会给出一个通过livesIn键在Person和House之间使用reverseRelation的例子。当您更新关系的任何一方时,它将更新关系的两侧。

在您添加帖子的示例中,因为与UserModel和Post存在双向关系,指定“所有者”将导致现有的UserModel(currentUser)也被更新。您将获得的是,当您向AccountPosts集合添加新帖子时,currentUser帖子也会反映正确的帖子,我假设您需要这些帖子。

因此,您可以保持reverseRelation,如果您只想在帖子信息中查看特定的User属性,可以在includeInJSON属性中指定这些属性。

示例位于此fiddle

// ModelB
var PostModel = Backbone.RelationalModel.extend({
    defaults: {
        'id': '',
        'text': '',
        'description': '',
        'account': null
    } 
}); 

// collection of ModelB
var AccountPosts = Backbone.Collection.extend({
    model: PostModel 
});  

// ModelA 
var UserModel = Backbone.RelationalModel.extend({
    defaults: {  
        'id': '',
        'customurl': '',
        'pictureurl': '', 
        'emailid': '',
        'trackingid': '',
        'gender': '', 
        'mobile': '', 
        'planid': '', 
        'posts': null 
    },

    relations: [
        {
            type: Backbone.HasMany,
            key: 'posts',
            relatedModel: PostModel,
            collectionType: AccountPosts,
            reverseRelation : { 
                key : 'account',
                includeInJSON: ['id', 'customurl', 'pictureurl']
            }  
        }
    ]
}); 

// json object returned from server request 
var accountJSON = {
    id: 1, emailid: 22222, trackingid: 3333, gender: 'M',
    customurl: 'www.myurl.com', mobile: '222-222-2222',
    pictureurl: 'www.mypic.com', planid: 444
}; 

var currentUser = new UserModel(accountJSON);  

// json object from server for posts
var postJSON = {
    id: 1, text: 'My First Post', description: 'A Post',
    account: { id: 1, customurl: 'www.myurl.com',
            pictureurl: 'www.mypic.com'}
};  

// example of just one post
var post = new PostModel(postJSON);

此JSON是结果

CURRENT USER JSON
{"id":1,"emailid":22222,"trackingid":3333,"gender":"M","customurl":"www.myurl.com","mobile":"222-222-2222","pictureurl":"www.mypic.com","planid":444,"posts":[{"id":1,"text":"My First Post","description":"A Post","account":{"id":1,"customurl":"www.myurl.com","pictureurl":"www.mypic.com"}}]}

POST JSON
{"id":1,"text":"My First Post","description":"A Post","account":{"id":1,"customurl":"www.myurl.com","pictureurl":"www.mypic.com"}}