backbonejs获取id列表的模型

时间:2013-11-10 13:44:53

标签: javascript backbone.js collections

要通过它的ID从集合中获取单个模型,我可以调用

var myObject = myCollection.get(id)

当我有一个我希望获得的几个模型的ID列表时,是否有更好的方法从集合中获取它们,而不是分别为每个id调用.get()?

以下代码片段可以完成这项工作,但对于该系列的大量请求似乎有些混乱。

var idList = new Array(34, 86, 167, 413);
var models = new Array();
for (var i = 0; i < idList.length; ++i) {
  models.push(myCollection.get(idList[i]));
}

感谢
- 本

2 个答案:

答案 0 :(得分:5)

实际上它根本不是很混乱,你只是打电话给4次收集。即使Backbone允许你一次“获取”多个ID,在事情的后端它仍然会做同样多的工作。

你或许可以稍微重写一下,这样看起来会更容易一些,但这更符合你的个人偏好。我可能会使用数组的替代形式和循环符号来做这样的事情。

var ids = [34, 86, 167, 413];
var selected = [];
for (var i in ids)
    selected.push(myCollection.get(ids[i]));

如果你要做很多事情,并希望让它看起来更干净,你可以使用过滤器来返回像mu所提到的较小的集合。

filterBy: function(attribute, value) {
    var filtered = this.filter(function(items) {
        return _.contains(value, items.get(attribute));
    });
    return new myCollection(filtered);
}

var newFilteredCollection = myCollection.filterBy('id', [34, 86, 167, 413]);

答案 1 :(得分:2)

如果你已经Backbone,那么你已经underscore(或LoDash),那么这个怎么样?

var ids = [34, 86, 167, 413];
var selected = _.map(ids, function (id) {
  return myCollection.get(id);
});

或者,作为效用函数(可以添加到Backbone.Collection原型):

/**
 * @param {Number[]}ids
 * @returns {Backbone.Model[]}
 */
getForIds: function (ids) {
  return _.map(ids, function (id) {
    // replace "myCollection" with "this" if extending Backbone.Collection:
    return myCollection.get(id);
  });
}