2013-08-02 189 views
4

我做了我的第一個骨幹應用程序,並收集排序問題。 使用該骨幹收集sortBy

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

回答

2

我不知道這是否是一個錯誤或sortBy骨幹適應的功能,但顯然它返回一個數組,而不是下劃線集合。

一個解決辦法是包裝在_(...)整個事情,它告訴下劃線到陣列回捲到一個集合:

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

編輯

大多數的骨幹下劃線方法似乎是可鏈接的(例如,將sortBy替換爲reject,然後運行)。看他們連接下劃線代理的主幹源,似乎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); 
}; 
+1

此幫助 VAR SortedFriends = _(MyFriends.sortBy(函數(朋友){ 回報friend.get( 「UID」); })); 謝謝! – fyodor

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();