Handlebars.js: Solicitação de recurso: ajudante "join" integrado

Criado em 27 out. 2011  ·  8Comentários  ·  Fonte: handlebars-lang/handlebars.js

Não consegui descobrir uma maneira de usar um auxiliar interno para ingressar em uma lista de itens com um delimitador. Se já houver um auxiliar interno ou uma combinação de auxiliares internos que possam fazer isso, informe-me. Caso contrário, sugiro que você adicione um auxiliar interno chamado "join" que tenha um parâmetro para o delimitador.

Por exemplo, o modelo conteria algo assim:

 {{join myArray delimiter=", "}}

Acabei registrando meu próprio ajudante para minhas necessidades imediatas:

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

Isso deve ser modificado para lidar com casos em que o contexto é nulo, o contexto não é uma matriz, o delimitador é nulo etc.

feature

Comentários muito úteis

Para nó:

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>

Todos 8 comentários

Acabei de fazer isso para mim hoje:

Handlebars.registerHelper('join', function(val, delimiter, start, end) { 
    return [].concat(val).slice(start, end).join(delimiter); 
});

Se val não for um array, tem o efeito de apenas retornar val. Os parâmetros do 2º ao 4º são totalmente opcionais (o delimitador padrão é ","). Eu só testei no Chrome até agora.

Atualização: isso quebra no IE8. [...].slice(undefined, undefined) retorna um array vazio ao invés do array inteiro como em outros navegadores. Além disso, se você não fornecer um delimitador em sua definição de modelo, o Handlebars passará o objeto de hash como o delimitador, que o IE renderizará como '[Objeto]' em vez de uma vírgula como outros navegadores. Minha versão revisada ficou assim:

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); 
});

Não tão elegante, mas verificar a sanidade de suas entradas provavelmente é uma boa prática.

--Chade

Eu incorporei as sugestões de 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);
    }
});

Ops, eu quis tirar uma linha:

//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 : qual versão do guidão você está usando? Não consigo fazê-lo funcionar com a versão beta 4. Recebo o seguinte erro ao usar sintaxe como:

{{join list_of_words delimiter=","}}

O erro:

Uncaught Error: Parse error on line 35:
..._of_words delimiter=&quot;,&quot;}}</tex
-----------------------^
Expecting 'STRING', 'INTEGER', 'BOOLEAN', 'ID'

Eu estava usando o beta 3. Dê uma olhada no meu exemplo de trabalho em http://jsfiddle.net/jlubean/YS3EV/

Eu escrevi isso: http://mametipsum.herokuapp.com/. Prefiro não exigir que as pessoas especifiquem um auxiliar como este (consulte a guia "Modelo"). Eu gostaria de mantê-lo simples. Eu gostaria que os espaços fossem o padrão ao imprimir uma matriz. Fico feliz em substituir o auxiliar de matriz padrão, mas como faço isso? Obrigado.

Pessoalmente, acho que o Handlebars é melhor mantido simples. Se alguém gostaria de montar um repo/gist com ajudantes úteis, provavelmente poderíamos vinculá-lo ou destacá-lo.

Para nó:

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>
Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

rizen picture rizen  ·  6Comentários

amirzandi picture amirzandi  ·  7Comentários

rhariraman picture rhariraman  ·  5Comentários

LengYXin picture LengYXin  ·  3Comentários

ustun picture ustun  ·  6Comentários