Backbone.js - 排序和迭代 - 比较器不工作

时间:2015-12-30 20:14:29

标签: javascript backbone.js

我创建了一组用户,然后添加了用户,但是当我打印用户时,他们没有排序。

我尝试使用.add.create并设置了comparator,因此我认为它会自动排序。

我缺少什么?
我想至少按排序顺序遍历用户。

我的代码带有一些评论

http://plnkr.co/edit/kMRdPfsjWDEIdHc22Ay0?p=preview

// A user
var User = Backbone.Model.extend({
  sync: function(){} // prevent send
});

// a collection
var Friends = Backbone.Collection.extend({
  comparator: 'lname',
  model: User
});

// instance
var friends = new Friends();

// loop through and add new users
for(var i=0; i<10; i++){
  friends.create({
    fname: createName(),
    lname: createName()
  });

  // tried with add, still not sorted
  // friends.add(new User({
  //   fname: createName(),
  //   lname: createName()
  // }));
}

// print what we have so far
console.log( friends.toJSON(), friends );

// when page is ready append to a table
$(document).ready(function(){
  var i = 0;
  friends.each(function( model ){
    i++;
    $('.friends tbody').append("<tr><td>" + i + "</td><td>" + model.get('lname') + "</td><td>" + model.get('fname') + "</td></tr>");
  });
})
;


// funtion to create random names 
function createName()
{
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

    for( var i=0; i < 5; i++ ){
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}

1 个答案:

答案 0 :(得分:1)

在你的情况下,比较器通过使用词法比较进行排序。这意味着b在A之后出现,因为它首先检查大写字符优先级。你需要的是这样的自定义比较器函数,它不区分大小写:

var Friends = Backbone.Collection.extend({
  // comparator: 'lname',
  comparator: function(a,b){

    a = a.get('lname').toLowerCase();
    b = b.get('lname').toLowerCase();  
    if (a < b) { return -1; }
    if (a > b) { return 1; }
    else { return 0; }

  },
  model: User
});

这里是带有自定义比较器功能的分叉Plunkr的链接。