在Backbone中对模型(数组)进行排序?

时间:2015-03-21 00:12:19

标签: javascript arrays sorting backbone.js

我只是在学习骨干,所以如果标题不正确,请原谅我。

我想对模型进行排序(模型是一个数组吗?我有错吗?)但我不能这样做。在常规JS中,我可以使用此函数对数组进行排序,我知道它可以工作:

getObjects: function(obj, key, val) {
  var objects = [];
  for (var i in obj) {
    if (!obj.hasOwnProperty(i)) continue;
    if (typeof obj[i] == 'object') {
        objects = objects.concat(getObjects(obj[i], key, val));
    } else if (i == key && obj[key] == val) {
        objects.push(obj);
    }
  }
  return objects;
}

但我不知道我应该把它放在Backbone中。我尝试将它放在视图中,但是我得到一个错误,说“未定义不是getObjects的函数”。

window.WineListView = Backbone.View.extend({

  initialize: function () {
    this.render();
  },

  //sort through JSON when getting different priority tasks
  getObjects: function(obj, key, val) {
    var objects = [];
    for (var i in obj) {
      if (!obj.hasOwnProperty(i)) continue;
      if (typeof obj[i] == 'object') {
        objects = objects.concat(getObjects(obj[i], key, val));
      } else if (i == key && obj[key] == val) {
        objects.push(obj);
      }
    }
    return objects;
  },

  render: function () {
    var wines = this.model.models;
    wines = getObjects(wines, 'completed', 'No'); 
    var len = wines.length;
    var startPos = (this.options.page - 1) * 8;
    var endPos = Math.min(startPos + 8, len);

    $(this.el).html('<ul class="thumbnails"></ul>');

    for (var i = startPos; i < endPos; i++) {
      $('.thumbnails', this.el).append(new WineListItemView({model: wines[i]}).render().el);
      //$('.thumbnails', this.el).append('<br/>');
    }

    $(this.el).append(new Paginator({model: this.model, page: this.options.page}).render().el);

    return this;
  }
});

如何声明我的getObjects函数以便可以访问它?模型不是数组吗?我应该采用不同的方式进行排序吗?任何帮助将不胜感激!谢谢。

1 个答案:

答案 0 :(得分:0)

如果您熟悉JavaScript中对象和数组的概念,则Backbone Model和Collection分别类似于JS对象和数组的包装器对象。

JS对象是一组键值对,类似地,Backbone模型将键值数据存储在其属性字段中。如果您想要在数组中使用多个类型的项目,那么您需要Backbone Collections。

Backbone模型将为您要使用的每个参数设置一个键,例如,如果您有Person模型,那么firstName只有一个可能的值。您可以拥有名为Persons的Person集合,然后按firstName对集合进行排序。

要在Backbone中排序,您需要为集合指定比较器,然后在集合上调用sort。

例如

this.collection.comparator = function(person) {
            return person.get('firstName');
 }
this.collection.sort();