Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 初始化后对主干集合进行排序_Backbone.js - Fatal编程技术网

Backbone.js 初始化后对主干集合进行排序

Backbone.js 初始化后对主干集合进行排序,backbone.js,Backbone.js,我正在使用Backbone.js呈现项目列表,例如书籍。呈现列表后,用户可以选择对其进行排序。因此,如果用户单击“按标题排序”或“按作者姓名排序”,列表将在客户端自行排序 window.Book = Backbone.Model.extend({ defaults: { title: "This is the title", author: "Name here" }, 在主干应用程序的上下文中使用什么是完成此排序的最佳方法。我是否在AppView中使用jQ

我正在使用Backbone.js呈现项目列表,例如书籍。呈现列表后,用户可以选择对其进行排序。因此,如果用户单击“按标题排序”或“按作者姓名排序”,列表将在客户端自行排序

  window.Book = Backbone.Model.extend({
   defaults: {
     title: "This is the title",
     author: "Name here"
   },

在主干应用程序的上下文中使用什么是完成此排序的最佳方法。我是否在AppView中使用jQuery dom分类器

比较器是您需要的

var PhotoCollection = Backbone.Collection.extend({
    model: Photo,
    comparator: function(item) {
        return item.get('pid');
    }
});

有一个关于这个主题的讨论,你可能想看看:

其缺点是,当用户选择“按X排序”时,您可以:

  • 在集合上设置
    比较器
    功能
  • 调用集合的
    sort
    函数(该函数将触发
    sort
    事件)
  • 在视图中侦听
    排序
    事件,然后(清除并)重新绘制项目
  • 处理步骤1和2的另一种方法是使用自己的方法调用集合的
    sortBy
    方法,然后触发视图可以侦听的自定义事件


    但是,清除和重画似乎是对视图进行排序并使其与集合的排序顺序保持同步的最简单(甚至可能是最快)的方法。

    您可以更新comparator函数,然后调用排序方法

    // update comparator function
    collection.comparator = function(model) {
        return model.get('name');
    }
    
    // call the sort method
    collection.sort();
    

    视图将自动重新呈现。

    这种方式效果良好,可以动态地按所有
    属性进行排序,并处理
    升序
    降序

    var PhotoCollection = Backbone.Collection.extend({
        model: Photo,
        sortByField: function(field, direction){
                sorted = _.sortBy(this.models, function(model){
                    return model.get(field);
                });
    
                if(direction === 'descending'){
                    sorted = sorted.reverse()
                }
    
                this.models = sorted;
        }
    });
    

    在初始化期间,比较器不用于对集合进行排序。在列表显示之后,用户可以用不同的方式重新排序,这就是我需要弄清楚的。谢谢rulfzid。我将在2分钟内尝试这种方法。
    sort
    事件是调用集合的sort函数时触发的事件,而不是
    reset
    在您的视图中,您需要侦听“sort”事件而不是“reset”(我认为这是旧版本的主干)。将相同的集合传递给视图并使用:this.listenTo(this.collection,'sort',this.render);这会产生大量僵尸视图吗?似乎每次“排序”时,您都在创建新的主干视图对象,这会占用更多的时间和空间,并留下旧的视图对象。那么如何进行排序呢?。。找到了。。。使用减号“return-model.get('name');”@Kirby,我认为带
    -
    符号的降序只适用于
    数字
    属性,而不适用于
    字符串
    属性?在排序函数中乘以
    -1
    ,以避免排序两次。@Leo这只有在字段为数字时才有用排序后,我有空值出现在顶部。如何将这些空值移到底部?@Jyothu我建议将空项从集合中移除,或对字段进行排序,该字段通过某种索引表示空值,并将其排序到底部。