Handlebars.js: ๊ธฐ๋Šฅ ์š”์ฒญ: ๋‚ด์žฅ๋œ "๊ฐ€์ž…" ๋„์šฐ๋ฏธ

์— ๋งŒ๋“  2011๋…„ 10์›” 27์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: handlebars-lang/handlebars.js

๊ธฐ๋ณธ ์ œ๊ณต ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ์žˆ๋Š” ํ•ญ๋ชฉ ๋ชฉ๋ก์— ์กฐ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๋„์šฐ๋ฏธ ๋˜๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๋„์šฐ๋ฏธ์˜ ์กฐํ•ฉ์ด ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” "join"์ด๋ผ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๋„์šฐ๋ฏธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ…œํ”Œ๋ฆฟ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

 {{join myArray delimiter=", "}}

๋‚˜๋Š” ๋‚ด ์ฆ‰๊ฐ์ ์ธ ํ•„์š”๋ฅผ ์œ„ํ•ด ๋‚ด ์ž์‹ ์˜ ๋„์šฐ๋ฏธ๋ฅผ ๋“ฑ๋กํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ปจํ…์ŠคํŠธ๊ฐ€ null, ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฐฐ์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ 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/. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด์™€ ๊ฐ™์€ ๋„์šฐ๋ฏธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค("ํ…œํ”Œ๋ฆฟ" ํƒญ ์ฐธ์กฐ). ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์„ ์ธ์‡„ํ•  ๋•Œ ๊ณต๋ฐฑ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋ฐฐ์—ด ๋„์šฐ๋ฏธ๋ฅผ ์žฌ์ •์˜ํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ฐ์‚ฌ ํ•ด์š”.

๊ฐœ์ธ์ ์œผ๋กœ ํ•ธ๋“ค๋ฐ”๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์œ ์šฉํ•œ ๋„์šฐ๋ฏธ์™€ ํ•จ๊ป˜ repo/gist๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๋งํฌํ•˜๊ฑฐ๋‚˜ ๊ฐ•์กฐ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๊ฒฝ์šฐ:

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 ๋“ฑ๊ธ‰