我正在使用一个包含“自身”集合的模型的集合。例如:
[{
id: 1
name: "John",
children: [
{
id: 32
name: "Peter",
children: []
},
{
id: 54
name: "Mary",
children: [
{
id:12,
name: "Kevin"
}
]
},
]
}]
假设我希望通过其ID获得Kevin“用户”。但我所拥有的只是“第一个集合”。我怎样才能做到这一点??关于在集合中设置用户?另一件事:它有可能从他身上获得所有凯文“父母”吗?像玛丽和约翰一样?
是否有人遇到过这样的问题?
非常感谢
答案 0 :(得分:0)
下划线(这是一个Backbone依赖,所以你已经拥有它)非常适合这种事情;如果你使用它的“map”函数(Backbone在Collection上提供的方法)和find函数,你可以执行以下操作:
findPersonInPeopleCollection: function(nameWeAreLookingFor) {
function findChildren(person) {
if (!person.children) return [person];
var children = _.map(person.children, function(child) {
foundPeople.push(findChildren(child);
})
return _.flatten(children);
}
var allPeople = _.flatten(myCollectionOfPeople.map(findChildren));
return _(allPeople).find(function(person) {
return person.get('name') == nameWeAreLookingFor;
}
}
如果你想最初存储父项,你可以为你的“Person”模型类的初始化函数添加逻辑,例如。
var Person = Backbone.Model.extend({
initialize: function() {
_.each(this.get('children'), function(child) {
child.parent = this;
}, this);
}
});
您也可以通过覆盖集合的添加方法或添加事件处理程序来执行类似操作,该事件处理程序会在添加人员后触发。
答案 1 :(得分:0)
我已经在User's Collection上创建了一个递归函数,它似乎解决了现在的问题(最好的是我可以用它来检索“深度”模型并进行更改。)。这样的事情(如果有人有任何建议,可以自由发表意见):
findUserById: function(id) {
var self = new Backbone.Collection(this.toJSON());
return thisCollection(id, this);
function thisCollection(id, collection, array) {
var innerSelf = collection || this;
var thisArray = array || [];
for(var i = innerSelf.models.length; i--;) {
if(innerSelf.models[i].get('id') == id) {
return [innerSelf.models[i]].concat([thisArray]);
}else {
if(innerSelf.models[i].get('children').length > 0) {
thisArray.push(innerSelf.models[i]);
return thisCollection(id, innerSelf.models[i].get('children'), thisArray);
}else {
innerSelf.remove(innerSelf.models[i]);
return thisCollection(id, self, []);
}
}
}
}
}
基本上我返回一个包含2个项目的数组。第一个是我正在寻找的记录,第二个是与该用户的父母一起的数组。