2013-04-05 47 views
0

我想我排序的用戶表,當我點擊一個個的。 我的用戶有:類型排序骨幹JS(飛)

  • 一個名字
  • 年齡
  • 一個id

當我點擊一個個,排序發生,但:

  • 當我整理我的用戶可以通過名字或姓氏,它僅適用於ASC DIRECTI上。
  • 當我的年齡我的用戶排序,它的工作原理,這兩個方向

任何想法?

這是我的觀點:

var UserListView = Backbone.View.extend({ 
    el: ".page", 
    events: { 
    'click .delete': 'deleteUser', 
    'click th': 'sortItem', 
    }, 
    initialize: function(){ 
    this.users = new UsersCollection(); 

    }, 

    sortItem: function(ev) { 
    var that = this; 
    var field = ev.currentTarget.id; 
    this.users.sort_field(field); 
    this.render(); 
    }, 

    deleteUser: function(ev) { 
    var id = ev.currentTarget.dataset.userId; 
    var user = new UserModel({ 
     id: id 
    }); 
    user.destroy({ 
     success: function() { 
     var userList = new UserListView(); 
     userList.render(); 
     } 
    }) 
    }, 

    render: function() { 
    var that = this;  
    this.users.fetch({ 
     success: function(users) { 
     var template = _.template(UserListTemplate, { 
      users: users.models 
     }); 
     that.$el.html(template); 
     } 
    }); 
    } 
}); 

我的收藏:

var UsersCollection = Backbone.Collection.extend({ 
    model: UserModel, 
    url: "/users", 
    initialize: function() { 
    this._compar = 'id'; 
    this._sortDir = 'asc'; 
    }, 
    comparator: function(user) { 
    console.log(this._sortDir); 
    return this._sortDir == 'asc' ? user.get(this._compar) : -user.get(this._compar); 
    }, 

    sort_field: function(field) { 
    this._compar = field; 
    this._sortDir = this._sortDir == 'asc' ? 'desc' : 'asc'; 
    this.sort(); 
    } 

}); 
+0

是'id'數字,應該排序爲一個數字? – ErikE 2013-04-05 19:38:27

回答

1

你有兩個問題:

  1. 您不能否定反轉字符串的排序順序他們。
  2. 你的排序方向翻轉,當你改變的領域,想必改變字段應的方向恢復到上升每次sort_field被稱爲偶數。

首先第一件事情。

comparator: function(a, b) { 
    a = a.get(this._compar); 
    b = b.get(this._compar); 
    var els = this._sortDir == 'asc' ? [ a, b ] : [ b, a ]; 
    return els[0] > els[1] ? 1 
     : els[0] < els[1] ? -1 
     :      0; 
} 

有很多:如果您切換到兩個參數comparator那麼你可以通過比較<>的東西,而不是試圖用否定顛倒順序招輕鬆搞定(1)的方式來寫這種邏輯,但在上述主題上只有變化。

您只需如果field檢查正在改變固定(2),如果是則重新排序方向,如果它不是那麼只需扳動方向:

sort_field: function(field) { 
    if(this._compar == field) { 
     this._sortDir = this._sortDir == 'asc' ? 'desc' : 'asc'; 
    } 
    else { 
     this._compar = field; 
     this._sortDir = 'asc'; 
    } 
    this.sort(); 
} 

演示: http://jsfiddle.net/ambiguous/Br4Kj/

在視圖級分離排序字段和排序的方向可能會更有意義,雖然,那麼你可以有單獨的字段(collection.sort_field(field))和方向(collection.sort_dir(dir))電話;當然,調用sort_field會重置升序方向,並且sort_dir將單獨離開排序字段。

+0

你是我心目中的英雄:) 我還有一個(微小)問題:如何骨幹。JS交易的那部分:ELS [0]> ELS [1] 對於爲例,我有「AAAA」,「AAAA」和「1111」,它是如何知道它是做哪種類型的排序?我只是想知道它是如何工作的,因爲我沒有找到任何關於它的文檔。 – Kai23 2013-04-05 22:49:11

+0

@ Kai23:Backbone對此並沒有做任何事情,這只是將字符串和數字與相同的'<' and '>'操作符進行比較的JavaScript。 – 2013-04-05 22:51:40

+0

謝謝你的澄清!祝你有個美好的夜晚(或白天,不知道你是哪個星球的那一部分)) – Kai23 2013-04-05 22:58:28