我有一个帐户的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对象被覆盖?如果错误导致此问题的原因是什么?
答案 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"}}