>我有一个帐户的 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"}}