Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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_Coffeescript - Fatal编程技术网

Backbone.js 主干收集比较器

Backbone.js 主干收集比较器,backbone.js,coffeescript,Backbone.js,Coffeescript,我用的是脊梁和木偶 我想对我的集合和渲染视图进行排序 但是奇怪的事情发生了 “/api/note/getList”,它返回(当视图初始化集合时调用) 这是我的收藏 define [ 'models/Note' ], (Note) -> class NoteCollection extends Backbone.Collection model : Note url : '/api/note/getList' compara

我用的是脊梁和木偶

我想对我的集合和渲染视图进行排序

但是奇怪的事情发生了

“/api/note/getList”,它返回(当视图初始化集合时调用)

这是我的收藏

define [
    'models/Note'
],
(Note) ->
    class NoteCollection extends Backbone.Collection

        model : Note
        url : '/api/note/getList'

        comparator : (item) =>
            console.log item.get 'id'
            return item.get 'id'
和console.log打印

22
22
11
打印“22”两次?同样,它也不能进行排序

我应该如何对收集进行排序

[编辑]

这是初始化集合的compisteView

define [    
    'hbs!./noteCollection_tpl'
    './noteItemView'
    'collections/NoteCollection'
],
(noteCollection_tpl, noteItemView, NoteCollection) ->
    class NoteCollectionView extends Backbone.Marionette.CompositeView
        template : noteCollection_tpl
        itemView : noteItemView
        itemViewContainer : '.noteListContainer'
        className : 'noteWrap'

        initialize : (options) ->
            @collection = new NoteCollection() 

@collection=new NoteCollection()=>我认为此运行会自动获取。

问题是您使用绑定函数作为比较器:

comparator : (item) =>
这就是主干的“比较器接受多少个参数”检查。从:

比较器
集合。比较器

[…]比较器可以定义为sortBy(传递接受单个参数的函数),sort(传递需要两个参数的比较器函数),[…]

如果我们往里看,我们会看到:

if (_.isString(this.comparator) || this.comparator.length === 1) {
  this.models = this.sortBy(this.comparator, this);
} else {
  this.models.sort(_.bind(this.comparator, this));
}
因此,如果
比较器
是一个采用一个参数的函数(即
比较器.length==1
),则将使用
排序
,比较器将获得一个参数;但是,如果
比较器
是不接受一个参数的函数,则使用标准
排序
,比较器将被传递两个参数

如果观察调用
比较器
,您将看到它得到两个参数。怎么会这样?如果
comparator.length
不是一,就会发生这种情况。您的
比较器
长度
为零,这是由于CoffeeScript实现
=>
的方式造成的;例如:

class C
    m1: (x) -> x
    m2: (x) => x

c = new C
console.log(c.m1.length)
console.log(c.m2.length)
将在控制台中为您提供
1
0

演示

如果您查看JavaScript以了解这一点:

class C
    m: (x) => x
你会看到的

生成
=>
方法。注意这里的
返回函数(){…}
?这意味着每个
=>
方法将声明
长度为零。恭喜你,我想你已经在CoffeeScript中发现了一个bug

如果对
比较器使用标准
->
方法:

comparator: (item) -> item.id
这样,CoffeeScript就不会弄乱您的
比较器
长度
值,您的排序也就开始有意义了

演示


似乎已报告此错误:



执行摘要:不要将
=>
用于主干采集比较器功能。

如果打印出采集,顺序是什么?comparator函数用于对集合进行排序,因此查看它打印出的内容不一定给出顺序。初始化集合时,将调用url。如何在加载url后挂接事件?
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
comparator: (item) -> item.id