4

我制作了我的第一个主干应用程序,但在集合排序方面遇到了一些问题。使用这个之后

var SortedFriends = MyFriends.sortBy(function(friend) {
          return friend.get("uid");
        });  

console.log(SortedFriends) 显示 SortedFriends 包含排序模型,但是当我尝试使用诸如“SortedFriends.each”或“SortedFriends.at”之类的集合函数时会出错:

TypeError: SortedFriends.each 不是函数。

代码:

  var Friend = Backbone.Model.extend({});          
      var Friends = Backbone.Collection.extend({
        model: Friend,            
      });  

      var MyFriends = new Friends();
      MyFriends.reset(<?=$friends?>);

      var FriendView = Backbone.View.extend({
          initialize: function(){
              model:Friend            
          },              
          tagName: "tr",
          template: _.template($('#item-template').html()),
          className: "document-row",          
          render: function() {                              

         this.$el.html(this.template(this.model.toJSON()));                            
              return this;             
          }          
      });     


    var SortedFriends = MyFriends.sortBy(function(friend) {
      return friend.get("uid");
    });          

    var addOne = function(element){           
        var view = new FriendView({model: element});
        $("#friends").append(view.render().el);
    }                              
    console.log(JSON.stringify(SortedFriends));
    SortedFriends.each(function(friend){
        var view = new FriendView({model: friend});
        $("#friends").append(view.render().el);            
    });
4

2 回答 2

3

如果您正在使用骨干集合,那么您最好使用comparator而不是集合方法

http://backbonejs.org/#Collection-comparator

当您准备好对您的收藏进行排序时:

MyFriends.comparator = function(friend){
   return friend.get("uid");
});
MyFriends.sort();

或者,如果您想保持未排序集合的顺序,那么您需要先克隆它

http://backbonejs.org/#Collection-clone

var SortedFriends = MyFriends.clone();
SortedFriends.comparator = function(friend){
   return friend.get("uid");
});
SortedFriends.sort();
于 2013-08-03T00:22:53.623 回答
2

我不确定这是一个错误还是 Backbone 改编的一个特性sortBy,但显然它返回一个数组,而不是一个 Underscore 集合。

一种解决方法是将整个内容包装在 中_( ... ),这告诉 Underscore 将数组包装回集合中:

var SortedFriends = _(MyFriends.sortBy(function(friend) {
  return friend.get("uid");
}));

编辑

Backbone 中的大多数下划线方法似乎都是可链接的(例如,替换sortByreject,它会运行)。查看他们连接 Underscore 代理的 Backbone 源,似乎sortBy处理方式有所不同。我不明白他们为什么要这样做……

var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
    'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf',
    'isEmpty', 'chain'];

_.each(methods, function(method) {
    Collection.prototype[method] = function() {
      var args = slice.call(arguments);
      args.unshift(this.models);
      return _[method].apply(_, args);
    };
});

var attributeMethods = ['groupBy', 'countBy', 'sortBy'];

_.each(attributeMethods, function(method) {
    Collection.prototype[method] = function(value, context) {
      var iterator = _.isFunction(value) ? value : function(model) {
        return model.get(value);
      };
      return _[method](this.models, iterator, context);
};
于 2013-08-02T07:10:49.843 回答