Backbone.js 主干收集比较器
我用的是脊梁和木偶 我想对我的集合和渲染视图进行排序 但是奇怪的事情发生了 “/api/note/getList”,它返回(当视图初始化集合时调用) 这是我的收藏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
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