Handlebars.js: рдлрд╝реАрдЪрд░ рдЕрдиреБрд░реЛрдз: рдмрд┐рд▓реНрдЯ-рдЗрди "рдЬреЙрдЗрди" рд╣реЗрд▓реНрдкрд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 27 рдЕрдХреНрддреВре░ 2011  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: handlebars-lang/handlebars.js

рдореИрдВ рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрд╛ред рдпрджрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╣рд╛рдпрдХ рдпрд╛ рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рдЕрдиреНрдпрдерд╛, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк "рдЬреЙрдЗрди" рдирд╛рдордХ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╣рд╛рдпрдХ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

 {{join myArray delimiter=", "}}

рдореИрдВрдиреЗ рдЕрдкрдиреА рддрддреНрдХрд╛рд▓ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╣рд╛рдпрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛:

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

рд╕рдВрджрд░реНрдн рдХреЗ рд╢реВрдиреНрдп рд╣реЛрдиреЗ рдкрд░ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рдВрджрд░реНрдн рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИ, рд╕реАрдорд╛рдВрдХрдХ рд╢реВрдиреНрдп рд╣реИ, рдЖрджрд┐ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдиреЛрдб рдХреЗ рд▓рд┐рдП:

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

рдпрджрд┐ рд╡реИрд▓ рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдХреЗрд╡рд▓ рд╡реИрд▓ рд▓реМрдЯрдиреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░рд╛-рдЪреМрдерд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реАрдорд╛рдВрдХрдХ "," рд╣реИ)ред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИред

рдЕрджреНрдпрддрди: рдпрд╣ IE8 рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред [...].slice(undefined, undefined) рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреА рддрд░рд╣ рд╕рдВрдкреВрд░реНрдг рд╕рд░рдгреА рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣реИрдВрдбрд▓рдмрд╛рд░реНрд╕ рд╣реИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ IE рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреА рддрд░рд╣ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЗ рдмрдЬрд╛рдп '[рдСрдмреНрдЬреЗрдХреНрдЯ]' рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдореЗрд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

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

рдЗрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдХреА рд╡рд┐рд╡реЗрдХ-рдЬрд╛рдВрдЪ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред

--рдЪрд╛рдбреЛ

рдореИрдВрдиреЗ рд╕реЗрдмрд░рд▓реЗ рдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ:

//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.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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

LengYXin picture LengYXin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

morgondag picture morgondag  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DylanPiercey picture DylanPiercey  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

janus-reith picture janus-reith  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

novwhisky picture novwhisky  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ