Метод 1: Пользовательский Accessor
Если у вас есть контроль над контекстом (и вы, вероятно), вы можете реализовать это с аксессорами собственности. Допустим, ваш контекст содержит комментарии в случайном порядке:
var context = {
comments: [
{ idx:6, text:'violet' },
{ idx:1, text:'orange' },
{ idx:0, text:'red' },
{ idx:5, text:'indigo' },
{ idx:3, text:'green' },
{ idx:2, text:'yellow' },
{ idx:4, text:'blue' },
],
};
Вы можете просто отсортировать comments
массив на месте перед визуализацией шаблона (обратите внимание, что для числовых значений, можно просто вычесть их, чтобы получить естественный порядок):
context.comments.sort(function(a,b) { return a.idx - b.idx; });
Проблема в том, что будет изменен объект контекста, который вы, возможно, не захотите делать. Решение состоит в том, чтобы предоставить пользовательский аксессуар , который будет возвращать комментарии, отсортированные по специальному свойству. Вот как мы можем сделать это:
Object.defineProperty(context, 'commentsByIdx', {
get: function() {
// note that we call concat() to create a copy of
// the array; otherwise we are modifying the
// the original array, which is a side effect
return this.comments.concat()
.sort(function(a,b) { return a.idx - b.idx });
}
});
Вы можете увидеть это решение в действии здесь: http://jsfiddle.net/Jammerwoch/ShZLY/
Способ 2: рули Блок Helper
Другой подход заключается в реализации Handlebars block helper. Этот подход будет работать лучше, если у вас нет большого контроля над контекстом (или вы не хотите заражать его настраиваемыми свойствами). Просто зарегистрировать помощника Рули:
Handlebars.registerHelper('eachByIdx', function(context,options){
var output = '';
var contextSorted = context.concat()
.sort(function(a,b) { return a.idx - b.idx });
for(var i=0, j=contextSorted.length; i<j; i++) {
output += options.fn(contextSorted[i]);
}
return output;
});
И называть это как так в шаблоне:
{{#eachByIdx comments}}
<li>{{text}}</li>
{{/eachByIdx}}
в действии здесь: http://jsfiddle.net/Jammerwoch/aeCYg/1/
В целом, я считаю, первый метод предпочтительней , поскольку он создает новый вид ваших данных, который потенциально полезен вне Handlebars. Кроме того, для обычного читателя кода Handlebars это будет иметь больше смысла.
http://stackoverflow.com/questions/11884960/how-to-get-index-in-handlebars-each-helper Это то, что вы ищете? –
Аналогичные, но я хочу сортировать и отображать на моем собственном INDEX. – user533844
Должен ли я размещать дополнительную информацию о моем вопросе? – user533844