Handlebars.js: Запрос функции: встроенный помощник "присоединения"

Созданный на 27 окт. 2011  ·  8Комментарии  ·  Источник: handlebars-lang/handlebars.js

Я не мог найти способ использовать встроенный помощник для объединения списка элементов с разделителем. Если уже есть встроенный помощник или комбинация встроенных помощников, которые могут это сделать, сообщите мне об этом. В противном случае я предлагаю вам добавить встроенный помощник под названием «join», у которого есть параметр для разделителя.

Например, шаблон будет содержать что-то вроде этого:

 {{join myArray delimiter=", "}}

В итоге я зарегистрировал своего собственного помощника для своих неотложных нужд:

Handlebars.registerHelper("join", function(context, block) {
     return context.join(block.hash.delimiter);
});

Это должно быть изменено для обработки случаев, когда контекст имеет значение null, контекст не является массивом, разделитель равен нулю и т. д.

Самый полезный комментарий

Для узла:

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>

Все 8 Комментарий

Я только что сделал это для себя сегодня:

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=&quot;,&quot;}}</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>
Была ли эта страница полезной?
0 / 5 - 0 рейтинги