初始化主干关系后被覆盖的主干模型



>我有一个帐户的 JSON 响应,我正在基于该帐户创建 ModelA,该响应将被登录用户。

JSON 响应为 id、电子邮件 ID、跟踪 ID、性别、自定义网址、移动设备、picture_url和套餐 ID。

此外,我有一个正在创建ModelB的帖子的JSON响应,JSON响应为id,文本,描述,所有者{id,自定义网址和图片网址}。

我的模型A作为这种关系

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

我创建模型 A 的实例

currentUser = new ModelA()

和帖子实例

post = new ModelB()

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

我猜 backbone 在内部创建了每个模型的引用,并且由于模型 id 相同,因此第二个覆盖了第一个。

如果我的猜测是正确的,我如何避免当前用户对象被覆盖,如果错误,此问题的原因是什么?

当您使用主干关系反向关系时,它会创建与模型及其相关模型的双向关系。如果您查看"骨干关系"页面上的示例,它们给出了一个通过 livesIn 键在人和房屋之间使用反向关系的示例。当您更新关系的任何一方时,它将更新关系的两端。

在您的示例中,当您添加帖子时,因为与用户模型

和帖子存在双向关系,指定"所有者"将导致现有用户模型(当前用户)也更新。您将获得的是,每当您将新帖子添加到您的AccountPosts集合时,当前用户帖子也会反映正确的帖子,我假设您会想要。

为了保持反向关系,如果您只想在帖子信息中看到特定的用户属性,则可以在 includeInJSON 属性中指定这些属性。

例子就是在这个小提琴上

// 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"}}

相关内容

  • 没有找到相关文章

最新更新