3

要通过它的 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]));
}

谢谢
- 本

4

2 回答 2

5

实际上它一点也不乱,你只调用了 4 次集合。即使 Backbone 允许您一次“获取”多个 id,在后端它仍然会做相同数量的工作。

你也许可以重写一些东西,让它们看起来更容易,但这更多的是你的个人喜好。我可能会使用数组的替代形式和 for 循环表示法来做这样的事情。

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]);
于 2013-11-10T14:33:31.690 回答
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);
  });
}
于 2015-09-22T21:02:34.580 回答