2013-11-21 2 views
4

Я использую магистраль и марионетку,Магистральный компаратор

и я хочу сортировать свою коллекцию и визуализацию.

но что-то странное.

'/ апи/примечание/GetList', он возвращает (и это называется, когда коллекция инициализироваться зрения)

[{"id":22,"name":"Test2","isPublic":1},{"id":11,"name":"Test1","isPublic":1},{"id":33,"name":"Test3","isPublic":1}] 

и это моя коллекция,

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 print

22 
22 
11 

распечатать '22' дважды? также он не сортирует ни один.

Как сделать сортировку коллекции?

[EDIT]

Это мой compisteView, что инициализация Collection

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 = новый NoteCollection() => выборки этот пробег автоматически я думаю.

+0

Если вы распечатываете коллекцию, какой заказ? Функция сравнения используется для сортировки коллекции, поэтому просмотр того, что она распечатывает, не обязательно дает вам заказ. – elevine

+0

, когда коллекция будет инициализирована, вызывается url. как я могу подключить событие после загрузки URL-адреса? –

ответ

10

Проблема заключается в том, что вы используете связанную функцию компаратора:

comparator : (item) => 

и сбивает с толку Backbone в «сколько аргументов имеет компаратор взять» чек. Из fine manual:

компаратораcollection.comparator

[...] Компаратор может быть определен как 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)); 
} 

Так что, если comparator является функцией, которая принимает один аргумент (т. comparator.length === 1), то будет использоваться sortBy, и компаратор получит один аргумент; однако, если comparator - это функция, которая не принимает один аргумент, используется стандарт sort, и компаратору будут переданы два аргумента.

Если вы наблюдаете за своим comparator, вы увидите, что он получает два аргумента. Как это могло случиться? Это произойдет, если comparator.length не был одним.Ваш 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 в консоли.

Demo: http://jsfiddle.net/ambiguous/GAAap/

Если вы посмотрите на JavaScript для этого:

class C 
    m: (x) => x 

Вы увидите, что this function is used

__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 

генерировать => методы. Обратите внимание на то, что return function() { ... }? Это означает, что каждый метод => заявит, что имеет нулевое значение length. Поздравляю, я думаю, что вы снова обнаружили ошибку в CoffeeScript.

Если вы используете стандартный -> метод для comparator:

comparator: (item) -> item.id 

затем CoffeeScript не задрать comparator «ы length значение и ваша сортировка начинает иметь смысл.

Demo: http://jsfiddle.net/ambiguous/WXDcJ/


Похоже epidemian уже сообщили об этой ошибке:

https://github.com/jashkenas/coffee-script/pull/2872


Выполнение Сводка: Не используйте => для функций компаратора.

Смежные вопросы