Я не мог найти способ использовать встроенный помощник для объединения списка элементов с разделителем. Если уже есть встроенный помощник или комбинация встроенных помощников, которые могут это сделать, сообщите мне об этом. В противном случае я предлагаю вам добавить встроенный помощник под названием «join», у которого есть параметр для разделителя.
Например, шаблон будет содержать что-то вроде этого:
{{join myArray delimiter=", "}}
В итоге я зарегистрировал своего собственного помощника для своих неотложных нужд:
Handlebars.registerHelper("join", function(context, block) {
return context.join(block.hash.delimiter);
});
Это должно быть изменено для обработки случаев, когда контекст имеет значение null, контекст не является массивом, разделитель равен нулю и т. д.
Я только что сделал это для себя сегодня:
Handlebars.registerHelper('join', function(val, delimiter, start, end) {
return [].concat(val).slice(start, end).join(delimiter);
});
Если val не является массивом, он просто возвращает val. Параметры 2-4 совершенно необязательны (разделитель по умолчанию ","). Я пока тестировал только на Chrome.
Обновление: это не работает в IE8. [...].slice(undefined, undefined)
возвращает пустой массив, а не весь массив, как в других браузерах. Кроме того, если вы не указали разделитель в определении своего шаблона, Handlebars передает хеш-объект в качестве разделителя, который IE отображает как «[Object]», а не запятую, как другие браузеры. Моя исправленная версия выглядит так:
Handlebars.registerHelper('join', function(val, delimiter, start, end) {
var arry = [].concat(val);
delimiter = ( typeof delimiter == "string" ? delimiter : ',' );
start = start || 0;
end = ( end === undefined ? arry.length : end );
return arry.slice(start, end).join(delimiter);
});
Не так изящно, но проверка правильности ввода, вероятно, является хорошей практикой.
--Чад
Я включил предложения Ceberle:
//Handlebars "join" block helper that supports arrays of objects or strings.
//If "delimiter" is not speficified, then it defaults to ",". You can use "start",
//and "end" to do a "slice" of the array.
Handlebars.registerHelper('join', function(items, block) {
var delimiter = block.hash.delimiter || ",",
start = start = block.hash.start || 0,
len = items ? items.length : 0,
end = block.hash.end || len,
out = "";
if(end > len) end = len;
if ('function' === typeof block) {
for (i = start; i < end; i++) {
if (i > start) out += delimiter;
out += block(items[i]);
if('string' === typeof items[i])
out += items[i];
else
out += block(items[i]);
}
return out;
} else {
return [].concat(items).slice(start, end).join(delimiter);
}
});
Ой, я хотел убрать одну строчку:
//Handlebars "join" block helper that supports arrays of objects or strings.
//If "delimiter" is not speficified, then it defaults to ",". You can use "start",
//and "end" to do a "slice" of the array.
Handlebars.registerHelper('join', function(items, block) {
var delimiter = block.hash.delimiter || ",",
start = start = block.hash.start || 0,
len = items ? items.length : 0,
end = block.hash.end || len,
out = "";
if(end > len) end = len;
if ('function' === typeof block) {
for (i = start; i < end; i++) {
if (i > start)
out += delimiter;
if('string' === typeof items[i])
out += items[i];
else
out += block(items[i]);
}
return out;
} else {
return [].concat(items).slice(start, end).join(delimiter);
}
});
@jlubean : какую версию руля вы используете? Я не могу заставить его работать до бета-версии 4. Я получаю следующую ошибку при использовании такого синтаксиса:
{{join list_of_words delimiter=","}}
Ошибка:
Uncaught Error: Parse error on line 35:
..._of_words delimiter=","}}</tex
-----------------------^
Expecting 'STRING', 'INTEGER', 'BOOLEAN', 'ID'
Я использовал бета-версию 3. Взгляните на мой рабочий пример на http://jsfiddle.net/jlubean/YS3EV/ .
Я написал это: http://mametipsum.herokuapp.com/. Я бы предпочел не требовать, чтобы люди указывали такой помощник (см. вкладку «Шаблон»). Я бы хотел, чтобы это было просто. Я бы хотел, чтобы пробелы были по умолчанию при печати массива. Я рад переопределить помощник массива по умолчанию, но как мне это сделать? Спасибо.
Лично я считаю, что Handlebars лучше всего сделать простым. Если кто-то захочет собрать репозиторий/суть с полезными помощниками, мы, вероятно, могли бы сослаться на него или иным образом выделить его.
Для узла:
Handlebars.registerHelper( "join", function( array, sep, options ) {
return array.map(function( item ) {
return options.fn( item );
}).join( sep );
});
<p>
{{#join companies "<br>"}}
{{name}}
{{/join}}
</p>
Самый полезный комментарий
Для узла: