Backbone.js 当两个独立(但“相关”的)集合包含具有相同ID的模型时,主干关系是否存在问题?
我在显示用户列表的页面上使用Backbone.js、Marionette.js和Backbone relational。每个用户都被标识为“待定”或“活动”用户。“待定”用户是指已发送加入邀请但尚未接受的用户;“主动”指已确认的人员。挂起用户列表由一个API调用获取,活动用户列表由另一个API调用获取 情况是这样的: 一个用户,我们称他为“Miguel”,被带入到活动用户的集合中。但是,如果将与Miguel具有相同ID的“待定”用户提取到待定用户集合中,Miguel将收到属性“Status”:“pending”。我可以验证Miguel没有被提取到(或传递到--)挂起用户的集合中 因此,我想知道主干关系是否存在与模型ID有时相互匹配的两个集合建立关系的问题 举例说明: 如果活动用户的集合: { 身份证号码:22, “名字”:“米格尔” } 和未决用户集合: { 身份证号码:22, “名字”:“贝蒂”, “状态”:“挂起” } 然后米格尔看起来像:{ 身份证号码:22, “名字”:“米格尔”, “状态”:“挂起” } 以下是我的型号和系列的代码:Backbone.js 当两个独立(但“相关”的)集合包含具有相同ID的模型时,主干关系是否存在问题?,backbone.js,backbone-relational,Backbone.js,Backbone Relational,我在显示用户列表的页面上使用Backbone.js、Marionette.js和Backbone relational。每个用户都被标识为“待定”或“活动”用户。“待定”用户是指已发送加入邀请但尚未接受的用户;“主动”指已确认的人员。挂起用户列表由一个API调用获取,活动用户列表由另一个API调用获取 情况是这样的: 一个用户,我们称他为“Miguel”,被带入到活动用户的集合中。但是,如果将与Miguel具有相同ID的“待定”用户提取到待定用户集合中,Miguel将收到属性“Status”:“
/**
* "NV" is a base class we created for this application. It handles .save(), .toPatchJSON(), tracks changed attrs and other such functions.
*/
/**
* This is the collection of "pending" users
*/
var PendingUsers = NV.Collection.extend({
model: User,
initialize: function(models, options) {
Backbone.Collection.prototype.initialize.call(this,models,options);
this.org = options.org;
},
url: function() {
return "/api/organization/" + this.org.get("Id") + "/invites";
},
parse: function(resp, options) {
// "Miguel" never shows up in this function yet obtains the "Pending" Status property.
return _.map(resp, function(invite) {
return {
Id: invite.Id,
FirstName: invite.FirstName,
LastName: invite.LastName,
Email: invite.Email,
InvitationTime: invite.InvitationTime + "+00:00",
Status: 'Pending'
}
});
}
});
/**
* This is the collection of "active" users
*/
var ActiveUsers = NV.Collection.extend({
model: User,
initialize: function(models, options) {
Backbone.Collection.prototype.initialize.call(this,models,options);
this.org = options.org;
},
url: function() {
return "/api/organization/" + this.org.get("Id") + "/users";
}
});
/**
* The collections of active and pending users are relations of the "Organization" model. This is what's passed to the View that renders the list of users.
*/
var Organization = NV.Model.extend({
defaults: {
Name: ''
},
relations: [
{
type: Backbone.HasMany,
key: 'Users',
relatedModel: User,
collectionType: ActiveUsers,
collectionOptions: function(org) {
return {'org': org };
}
},
{
type: Backbone.HasMany,
key: 'InvitedUsers',
relatedModel: User,
collectionType: PendingUsers,
collectionOptions: function(org) {
return {'org': org };
}
}
],
urlRoot: "/api/organization"
});
return Organization;
/**
* Both pending and active collections build from the User model, so here it is
*/
var User = NV.Model.extend({
schema: {
Name: 'Text',
Email: { validators: ['required', 'email'] },
password: 'Password'
},
defaults: {
FirstName: '',
LastName: '',
Email: ''
},
fetch: function(options) {
this.me = options.me || false;
NV.Model.prototype.fetch.call(this,options);
},
avatar: function(options){
return "/api/user/" + this.get("Id") + "/avatar";
},
url: function() {
if (this.me) return "/api/user/me";
return "/api/user/" + this.get("Id");
}
});
return User;
如果我没有包括重要信息,请告诉我。在这个问题上!谢谢 你说得对,主干网。关系网对此有问题。在幕后,它保存了给定类型的所有模型的全局集合——在本例中是所有用户。 获取时发生的实际上是主干行为。它识别出您正在对现有集合(全局集合)进行复制,找到具有相同ID的模型并尝试合并数据,这将导致“Miguel”模型上的“Status”属性 这通常是一个理想的功能,因为保持同一类型的多个模型具有相同的id通常表明存在一些问题或数据加载不理想
一个快速的解决方法是通过扩展用户来创建额外的用户“类”,如PendingUser 这真的很有帮助。谢谢