2012-02-24 34 views
19

Tôi đang gặp khó khăn khi thực hiện một bộ so sánh xương sống, về cơ bản tôi muốn chọn các phương pháp sắp xếp khác nhau dựa trên tuyến đường và sử dụng bộ so sánh để sắp xếp bộ sưu tập. Lý tưởng nhất là tôi muốn giữ logic phân loại được gói gọn trong bộ sưu tập nhưng dường như bị kẹt. Ví dụ:thực hiện chính xác các bộ so sánh xương sống

Requests = Backbone.Collection.extend({ 
     model : Request, 
     comparator : function(ab) { 
      return -ab.id; 
     },   
     nooffers : function() { 
      return this.sortBy(function(ab) {    
       return ab.get('offers'); 
      }); 
     } 
    }); 

Vì vậy, theo mặc định, nó dựa trên so sánh mặc định - nhưng trong định tuyến của tôi, tôi muốn có thể sử dụng, ví dụ: làm một cái gì đó như

routes : { 
     "" : "index", 
     '/ordering/:order' : 'ordering' 
    }, 
    ordering : function(theorder) { 
     ordering = theorder; 
     if(theorder == 'nooffers') { 
      Request.comparator = Request.nooffers(); 
     } 
     Request.sort(); 
     listView.render(); 
     howitworksView.render(); 
    } 

Tuy nhiên trong trường hợp đó tôi gặp lỗi ('c.call không phải là một chức năng') bất kỳ ý tưởng nào?

+1

Câu trả lời là tốt nhưng câu hỏi xứng đáng với một số tình yêu (để gợi ra câu trả lời.) :-) – jmk2142

Trả lời

47

Bạn có một vài điều sai ở đây.

này không làm những gì bạn nghĩ nó:

if(theorder == 'nooffers') { 
    Request.comparator = Request.nooffers(); 
} 

Đó thực hiện phương pháp nooffers và gán kết quả của nó để Request.comparator. Nhưng sortBy trả về danh sách được sắp xếp:

nooffers : function() { 
    return this.sortBy(function(ab) {    
     return ab.get('offers'); 
    }); 
} 

và đặt danh sách đó làm hàm so sánh không làm gì hữu ích.

Bạn muốn thay đổi sự phân công để sử dụng chức năng chứ không phải là giá trị trả về của nó:

if(theorder == 'nooffers') { 
    Request.comparator = Request.nooffers; 
} 

và thay đổi chức năng để trở thành một chức năng so sánh hợp lệ:

nooffers : function(ab) { 
    return ab.get('offers'); 
} 

Demo (chạy với bạn giao diện điều khiển mở): http://jsfiddle.net/ambiguous/AAZCa/

Nhưng có ai đó từ bên ngoài nghịch ngợm với các phương pháp của bộ sưu tập như vậy có mùi xấu và bạn không nên làm đi. Thay vào đó, bạn nên yêu cầu các bộ sưu tập để thay đổi trật tự của nó với một cái gì đó như thế này:

var Requests = Backbone.Collection.extend({ 
    model: Request, 
    comparator: function(ab) { 
     if(this._order_by == 'offers') 
      return ab.get('offers'); 
     else if(this._order_by == 'id') 
      return -ab.id; 
     //... 
    }, 
    order_by_offers: function() { 
     this._order_by = 'offers'; 
     this.sort(); 
    }, 
    order_by_default: function() { 
     this._order_by = 'id'; 
     this.sort(); 
    }, 
    _order_by: 'id' 
}); 
//... 
rs.order_by_offers(); 

Demo: http://jsfiddle.net/ambiguous/uM9av/

Hoặc bạn có thể để cho các trao đổi bộ sưu tập của riêng mình comparator để tránh tất cả các logic điều kiện bên trong comparator:

var Requests = Backbone.Collection.extend({ 
    model: Request, 
    initialize: function() { 
     this._order_by_id = this.comparator; 
    }, 
    comparator: function(ab) { 
     return -ab.id; 
    }, 
    order_by_offers: function() { 
     this.comparator = this._order_by_offers; 
     this.sort(); 
    }, 
    order_by_default: function() { 
     this.comparator = this._order_by_id; 
     this.sort(); 
    }, 
    _order_by_offers: function(ab) { 
     return ab.get('offers'); 
    } 
}); 

Demo: http://jsfiddle.net/ambiguous/Pjfq2/

+2

Tôi muốn +1 cho bạn ngay cả khi điều này không đúng cho nỗ lực đó;) – ggozad

+0

@ggozad: Cảm ơn . Tôi thích dạy mọi người cách tránh các lỗi cũng như giúp họ sửa các lỗi hiện tại của mình. Và http://jsfiddle.net/ mất rất nhiều nỗ lực. –

+0

Cảm ơn rất nhiều, thực sự đánh giá cao thời gian bạn đã thực hiện để giải thích tất cả điều này! – Xrender

0

tôi đã viết tùy chỉnh m ethod trong bộ sưu tập mà sẽ chăm sóc sắp xếp cả lên xuống và cũng có thể nó cũng sẽ sắp xếp hồ sơ với chữ và số thích hợp

var LetterVariables = Backbone.Collection.extend({ 



    initialize: function (id) { 

     //id of the table 
     this.id = id; 

     this.sortVar = "id"; //default sorting column 
     this.sOrder = "asc" //default sort order 
    }, 
    //comparator function that will create a descending and an ascending order tot he view 
    comparator: function (item,itemb) { 
     var a=item.get(this.sortVar); 
     var b=itemb.get(this.sortVar); 
     if (this.sOrder == "asc") { 
      return this.SortCustom(a, b); 
     } 
     return -this.SortCustom(a, b); 
    }, 
    SortCustom:function(a,b){ 
       if (isNaN(a)) { 
        if (isNaN(b)) { 
         if (a > b) return 1; // before 
         if (b > a) return -1; // after 
         return 0; 
        } 
        return 1; 
       } 
       if (isNaN(b)) { 
        return -1; 
       } 
       if (+a > +b) return 1; // before 
       if (+b > +a) return -1; // after 
       return 0; 
    }, 
    Sort: function (by, order) { 

     this.sOrder = order; 
     this.sortVar = by; 
     this.sort(); 
    }}); 

// bạn có thể sắp xếp bằng cách sử dụng "Phân loại" phương pháp (xem hoa chặt chẽ S cho Sắp xếp phương pháp)

Các vấn đề liên quan