2016-06-03 2 views
1

Я пытаюсь выполнить пользовательский сортировку, используя функцию компаратора из вспомогательного элемента шаблона в Meteor.Исключение в шаблоне helper: Ошибка: ошибка совпадения

Вот мой шаблон помощник:

Template.move_list.helpers({ 
    assets() { 
    return Assets.find({}, { sort: sortFunction }); 
    } 
}); 

А вот функция сравнения:

const sortFunction = function (doc1, doc2) { 
    const barcodes = Session.get('barcodesArray'); 

    if (barcodes.indexOf(doc1.barcode) === -1 || barcodes.indexOf(doc2.barcode) === -1) { 
    return 0; 
    } 

    let last = null; 
    _.each(barcodes, function (barcode) { 
    if (barcode === doc1.barcode) last = doc1.barcode; 
    if (barcode === doc2.barcode) last = doc2.barcode; 
    }); 

    return last === doc1.barcode ? 1 : -1; 
} 

Ошибка

При загрузке страницы, возвращается следующее сообщение об ошибке:

Exception in template helper: Error: Match error: Failed Match.OneOf, Match.Maybe or Match.Optional validation

Я поставил точку останова в хроме в sortFunction, однако функция никогда не вводилась, и точка останова не достигла.

Конечно, ошибка не бросается, когда я удаляю sort.

Ссылки

Эта функция не очень хорошо документированы, однако здесь есть relevant part of the docs:

For local collections you can pass a comparator function which receives two document objects, and returns -1 if the first document comes first in order, 1 if the second document comes first, or 0 if neither document comes before the other. This is a Minimongo extension to MongoDB.

И commit by mitar добавляя функциональность, с примерами кода из теста:

var sortFunction = function (doc1, doc2) { 
    return doc2.a - doc1.a; 
}; 

c.find({}, {sort: sortFunction})

Может ли кто-нибудь понять эту ошибку?

+0

Теперь проблема должна быть исправлена. – MasterAM

+0

У вас была возможность попробовать? – MasterAM

ответ

0

Edit:

Этот вопрос должен быть решен в Метеор> = v1.3.3.1.

Локальные коллекции (то есть на стороне клиента и в памяти на стороне сервера) позволят передать функцию в качестве предложения sort.


ошибка происходит из mongo пакета, где спецификация не позволяет sort быть функцией.

@mitar изменен LocalCollection в пакете minimongo. LocalCollection является частью объекта Mongo.Collection на клиенте (его атрибут _collection), но запросы по-прежнему проверяются в соответствии с оригинальной спецификацией mongo. Я считаю, что это ошибка, так как спецификация не была обновлена, чтобы отразить изменения.

Чтобы преодолеть это (в то же время), либо имеют функцию принять суб-поле, таким образом, что значение sort является объектом:

var sortFunction = function (x, y) { 
    return x - y; 
}; 
c.find({}, {sort: {a: sortFunction}}); 

или использовать c._collection.find() вместо того, который будет работать (как насколько я могу судить), за исключением того, что он не будет применять никаких преобразований, определенных для коллекции.

var sortFunction = function (doc1, doc2) { 
    return doc2.a - doc1.a; 
}; 
c._collection.find({}, {sort: sortFunction}); 
Смежные вопросы