【问题标题】:backbonejs get Models for a list of ids主干js获取ID列表的模型
【发布时间】:2013-11-22 07:32:50
【问题描述】:

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

var myObject = myCollection.get(id)

当我想要获取多个模型的 ID 列表时,有没有比分别为每个 id 调用 .get() 更好的方法从集合中获取它们?

下面的代码 sn-p 完成了这项工作,但对集合的大量请求似乎有点混乱。

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]));
}

谢谢
- 本

【问题讨论】:

    标签: javascript backbone.js collections


    【解决方案1】:

    如果你有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);
      });
    }
    

    【讨论】:

      【解决方案2】:

      实际上它一点也不乱,你只在集合上调用了 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]);
      

      【讨论】:

      • 我想你可以使用filter,但你是对的,下面都是一样的东西。
      • 是的,我确实做了很多,现在我想起来了。我将其添加到答案中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多