Handlebars.js: {{#switch}} λ„μš°λ―Έ

에 λ§Œλ“  2014λ…„ 12μ›” 22일  Β·  15μ½”λ©˜νŠΈ  Β·  좜처: handlebars-lang/handlebars.js

이것은 맀우 μœ μš©ν•˜λ©° λΌμ΄λΈŒλŸ¬λ¦¬μ— 기본적으둜 μ œκ³΅λ˜λŠ” 것이 κ°€μž₯ 쒋을 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

{{#switch state}}
    {{#case "page1" "page2"}}toolbar{{/case}}
    {{#case "page1" break=true}}page1{{/case}}
    {{#case "page2" break=true}}page2{{/case}}
    {{#case "page3" break=true}}page3{{/case}}
    {{#default}}page0{{/default}}
{{/switch}}

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 νŽ˜μ΄μ§€λŠ” ν˜„μž¬ "ν•Έλ“€λ°” μŠ€μœ„μΉ˜ λ„μš°λ―Έ"에 λŒ€ν•œ 3번째 Google 검색 κ²°κ³Όμž…λ‹ˆλ‹€. 검색 μ—”μ§„μ—μ„œ μ—¬κΈ°λ‘œ μ˜€λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ {{#case "page1"}} 와 같은 단일 κ°’ case μ ˆμ„ 지원 ν•˜λŠ” Chris Montrois의 κ΅¬ν˜„μ΄ μžˆμŠ΅λ‹ˆλ‹€ .

Handlebars.registerHelper("switch", function(value, options) {
    this._switch_value_ = value;
    var html = options.fn(this); // Process the body of the switch block
    delete this._switch_value_;
    return html;
});

Handlebars.registerHelper("case", function(value, options) {
    if (value == this._switch_value_) {
        return options.fn(this);
    }
});

λ‹€μŒμ€ {{#case "page1" "page2"}} 와 같이 λ‹€μ–‘ν•œ κ°’μ˜ μ ˆμ„ μ§€μ›ν•˜λŠ” κ°œμ„ λœ case λ„μš°λ―Έμž…λ‹ˆλ‹€.

Handlebars.registerHelper("case", function() {
    // Convert "arguments" to a real array - stackoverflow.com/a/4775938
    var args = Array.prototype.slice.call(arguments);

    var options    = args.pop();
    var caseValues = args;

    if (caseValues.indexOf(this._switch_value_) === -1) {
        return '';
    } else {
        return options.fn(this);
    }
});

λͺ¨λ“  15 λŒ“κΈ€

이것은 ν‘œμ€€ λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•˜μ—¬ (ν•΄ν‚€ λ°©μ‹μœΌλ‘œ) 달성할 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€. μš°λ¦¬λŠ” 제3μžκ°€ λ„μš°λ―Έ APIλ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€μž₯ μ ν•©ν•œ λ°©μ‹μœΌλ‘œ ν•„μš”ν•œ λ„μš°λ―Έλ₯Ό κ΅¬ν˜„ν•  수 μžˆλ„λ‘ ν•˜λŠ” λŒ€μ‹  λ‚΄μž₯ λ„μš°λ―Έλ₯Ό μƒλŒ€μ μœΌλ‘œ κ°€λ³κ²Œ μœ μ§€ν•˜κ³ μž ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€λŠ” ν˜„μž¬ "ν•Έλ“€λ°” μŠ€μœ„μΉ˜ λ„μš°λ―Έ"에 λŒ€ν•œ 3번째 Google 검색 κ²°κ³Όμž…λ‹ˆλ‹€. 검색 μ—”μ§„μ—μ„œ μ—¬κΈ°λ‘œ μ˜€λŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ {{#case "page1"}} 와 같은 단일 κ°’ case μ ˆμ„ 지원 ν•˜λŠ” Chris Montrois의 κ΅¬ν˜„μ΄ μžˆμŠ΅λ‹ˆλ‹€ .

Handlebars.registerHelper("switch", function(value, options) {
    this._switch_value_ = value;
    var html = options.fn(this); // Process the body of the switch block
    delete this._switch_value_;
    return html;
});

Handlebars.registerHelper("case", function(value, options) {
    if (value == this._switch_value_) {
        return options.fn(this);
    }
});

λ‹€μŒμ€ {{#case "page1" "page2"}} 와 같이 λ‹€μ–‘ν•œ κ°’μ˜ μ ˆμ„ μ§€μ›ν•˜λŠ” κ°œμ„ λœ case λ„μš°λ―Έμž…λ‹ˆλ‹€.

Handlebars.registerHelper("case", function() {
    // Convert "arguments" to a real array - stackoverflow.com/a/4775938
    var args = Array.prototype.slice.call(arguments);

    var options    = args.pop();
    var caseValues = args;

    if (caseValues.indexOf(this._switch_value_) === -1) {
        return '';
    } else {
        return options.fn(this);
    }
});

μ•„μ£Ό μ’‹κ³  짧고 λ‹¬μ½€ν•©λ‹ˆλ‹€. λ‚˜λŠ” 과거에 훨씬 더 κΈ΄ 것을 λ§Œλ‚¬μ„ κ²ƒμž…λ‹ˆλ‹€.

μΆ”κ°€ν•  λͺ‡ 가지 ν•­λͺ©μ€ {{#default}} {{/default}} 및 {{#case "value" break=true}} μžˆμŠ΅λ‹ˆλ‹€.

@stevenvachon μš”μ²­λŒ€λ‘œ ;)

module.exports = {
    switch: function(value, options) {
        this._switch_value_ = value;
        this._switch_break_ = false;
        var html = options.fn(this);
        delete this._switch_break_;
        delete this._switch_value_;
        return html;
    },
    case: function(value, options) {
        var args = Array.prototype.slice.call(arguments);
        var options    = args.pop();
        var caseValues = args;

        if (this._switch_break_ || caseValues.indexOf(this._switch_value_) === -1) {
            return '';
        } else {
            if (options.hash.break === true) {
                this._switch_break_ = true;
            }
            return options.fn(this);
        }
    },
    default: function(options) {
        if (!this._switch_break_) {
            return options.fn(this);
        }
    }
};

@Billy- 이것을 어디에 포함해야 ν•©λ‹ˆκΉŒ?

@jimkoul 이것은 λ„μš°λ―Έ κΈ°λŠ₯μ΄λ―€λ‘œ 섀정에 따라 λ‹€λ¦…λ‹ˆλ‹€.

λ‚΄ μ„€μ •(Gulp + gulp-hb μ‚¬μš©)은 μœ„μ™€ 같이 λ„μš°λ―Έ κΈ°λŠ₯을 λ‚΄λ³΄λ‚΄λŠ” js νŒŒμΌμ— λŒ€ν•œ glob νŒ¨ν„΄ 지정을 μ§€μ›ν•˜λ―€λ‘œ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

// ...
.pipe(handlebars({
  helpers: 'handlebars/helpers/*.js'
})
// ...

μ—¬μ „νžˆ ν™•μ‹€ν•˜μ§€ μ•Šμ€ 경우 λ„μš°λ―Έ κΈ°λŠ₯이 ν•Έλ“€λ°”μ—μ„œ μž‘λ™ν•˜λŠ” 방식과 μ‚¬μš© 쀑인 ν•Έλ“€λ°” κ΅¬ν˜„κ³Ό ν•¨κ»˜ 이λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법에 λŒ€ν•΄ μ•½κ°„μ˜ 연ꡬλ₯Ό μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

μŠ€μœ„μΉ˜ 이름을 톡해 λ³€μˆ˜λ₯Ό 전달할 수 있고 각각을 톡해 μ™„μ „ν•œ {{assign}} λ₯Ό μž‘μ„±ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€. κ·Έλ ‡κ²Œ ν•˜λ©΄ μ˜΅μ…˜μ΄ λ³€μˆ˜ 값이 λ©λ‹ˆλ‹€.

λ˜ν•œ λŒ€/μ†Œλ¬Έμžκ°€ 좩쑱될 λ•Œ λ³€μˆ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ λ³€κ²½λ˜λ”λΌλ„ μ •μ˜λ˜μ§€ μ•Šμ€ λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

이것은 λ‚΄κ°€ λ„μš°λ―Έλ₯Ό μœ„ν•΄ κ°€μ§€κ³ μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

"use strict";
Handlebars.registerHelper("switch", function(value, options) {
    this._switch_value_ = value;
    this._switch_break_ = false;
    var html = options.fn(this);
    delete this._switch_break_;
    delete this._switch_value_;
    return html;
});

Handlebars.registerHelper("case", function(value, options) {
    var args = Array.prototype.slice.call(arguments);
    var options    = args.pop();
    var caseValues = args;

    if (this._switch_break_ || caseValues.indexOf(this._switch_value_) === -1) {
        return '';
    } else {
        if (options.hash.break === true) {
            this._switch_break_ = true;
        }
        return options.fn(this);
    }
});

Handlebars.registerHelper("default", function(options) {
    if (!this._switch_break_) {
        return options.fn(this);
    }
});

이것은 λ‚΄ hbs νŒŒμΌμ—μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

{{#assign "testParam"}}foo{{/assign}}
{{#switch testParam}}
    {{#case "boo"}}{{#assign "testParam"}}case1 has been met{{/assign}}{{/case}}
    {{#case "foo" break=true}}{{#assign "testParam"}}case2 has been met{{/assign}}{{/case}}
    {{#case "tried" break=true}}{{#assign "testParam"}}case3 has been met{{/assign}}{{/case}}
    {{#case "bwahahaha" break=true}}{{#assign "testParam"}}case4 has been met{{/assign}}{{/case}}
    {{#default break=true}}{{#assign "testParam"}}nothing matched{{/assign}}{{/default}}
{{/switch}}

{{#ttpartial "testSwitch.content"}}
        {{testParam}}
{{/ttpartial}}

λ˜λŠ” μœ„μ˜ 경우 쀑 ν•˜λ‚˜κ°€ μΆ©μ‘±λ˜λŠ” κ²½μš°μ—λ„ μœ„μ˜ μ–΄λ–€ 이유둜 인해 항상 기본값이 μš°μ„  μ μš©λ©λ‹ˆλ‹€.

λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” 것은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

Handlebars.registerHelper('switch', function(name, value, options) {
    this['_switch_value_' + name] = value;
    this['_switch_break_' + name] = false;
    var html = options.fn(this);
    delete this['_switch_break_' + name];
    delete this['_switch_value_' + name];
    return html;
});
Handlebars.registerHelper('case', function(name, value, options) {
    var args = Array.prototype.slice.call(arguments);
    var options    = args.pop();
    var caseValues = args;

    if ( this['_switch_break_' + name] || caseValues.indexOf(this['_switch_value_' + name]) === -1) {
        return '';
    } else {
        this['_switch_break_' + name] = true;
        return options.fn(this);
    }
});
Handlebars.registerHelper('default', function(name, options) {
    if ( !this['_switch_break_' + name] ) {
        return options.fn(this);
    }
});

μŠ€μœ„μΉ˜μ— 이름이 μ§€μ •λ˜μ–΄ μžˆμœΌλ―€λ‘œ λΆ„κΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€(imbrication? 단어가 β€‹β€‹ν™•μ‹€ν•˜μ§€ μ•ŠμŒ...)
λ˜ν•œ 쑰건이 좩쑱되면 항상 breakκ°€ μˆ˜ν–‰λ©λ‹ˆλ‹€.

즉:

    {{#switch "1" "aaa"}}
        {{#case "1" "aaa"}}
            {{#switch "2" "bbb"}}
                {{#case "2" "bbb"}}ok{{/case}}
            {{/switch}}
        {{/case}}
        {{#default "1"}}nok{{/default}}
    {{/switch}}

λ‚˜λŠ” 이것이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ³  μžˆλ‹€κ³  ν™•μ‹ ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ ν˜Όλž€μ„ λ“œλ € μ£„μ†‘ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ... each λ‚΄μ—μ„œ μŠ€μœ„μΉ˜κ°€ μž‘λ™ν•˜λŠ” 것이 κ°€λŠ₯ν•©λ‹ˆκΉŒ? ν•΄λ΄€λŠ”λ° 계속 였λ₯˜κ°€ λ‚˜λ„€μš”.

λ‚΄κ°€ 가진 것은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{{#each columns}}
    {{#switch this}}
        {{#case 'foo'}}
        {{/case}}
        {{#case 'bar'}}
        {{/case}}
    {{/switch}}
{{/each}}

ν•˜μ§€λ§Œ λ‚˜λŠ” 이것을 μ–»κ³ μžˆλ‹€ :

Uncaught TypeError: Cannot create property '_switch_value_' on string 'name'

this 은(λŠ”) μ˜ˆμƒν•œ κ²ƒκ³ΌλŠ” λ‹€λ₯Έ 것인 것 κ°™μ§€λ§Œ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

switch λ₯Ό λ‹€μŒκ³Ό 같이 λ³€κ²½ν•˜μ—¬ μž‘λ™ν•˜κ²Œ ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.

Handlebars.registerHelper({
    switch: function(value, options) {
        return options.fn({
            _switch_value_: value,
            _switch_break_: false
        });
    },
    //...
});

κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” λ‹€λ₯Έ κ²½μš°μ— λŒ€ν•΄ λ­”κ°€λ₯Ό μžƒλŠ” 것 κ°™μ•„μš”. 즉, 이 값을 항상 options μ—°κ²°ν•  수 있으며 μž‘λ™ν•  것이라고 μƒκ°ν•©λ‹ˆλ‹€.

@Billy- @a-le?

@infinityplusone λΆˆν–‰νžˆλ„ λ‚˜λŠ” μˆ˜λ…„ λ™μ•ˆ ν•Έλ“€ λ°”λ₯Ό μ œλŒ€λ‘œ μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ λ‚΄κ°€ μž‘μ„±ν•œ μ΄ν›„λ‘œ λ„μš°λ―Έ κ΅¬ν˜„μ΄ 크게 λ³€κ²½λ˜μ—ˆμ„ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬ΈμΌ κ²ƒμž…λ‹ˆλ‹€. 잘 λͺ¨λ₯΄κ² μ§€λ§Œ 싀망을 λ“œλ € μ£„μ†‘ν•©λ‹ˆλ‹€.

@infinityplusone λ‚΄ 버전을 μ‚¬μš©ν•˜λŠ” 경우 μŠ€μœ„μΉ˜μ˜ "이름"을 지정해야 ν•©λ‹ˆλ‹€.
λ”°λΌμ„œ κ·€ν•˜μ˜ 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{{#each columns}}
    {{#switch "myswitch" this}}
        {{#case "myswitch" 'foo'}}
        {{/case}}
        {{#case "myswitch" 'bar'}}
        {{/case}}
    {{/switch}}
{{/each}}

μ€‘μ²©λœ μŠ€μœ„μΉ˜ λΈ”λ‘μš©

Handlebars.__switch_stack__ = [];

Handlebars.registerHelper( "switch", function( value, options ) {
    Handlebars.__switch_stack__.push({
        switch_match : false,
        switch_value : value
    });
    var html = options.fn( this );
    Handlebars.__switch_stack__.pop();
    return html;
} );
Handlebars.registerHelper( "case", function( value, options ) {
    var args = Array.from( arguments );
    var options = args.pop();
    var caseValues = args;
    var stack = Handlebars.__switch_stack__[Handlebars.__switch_stack__.length - 1];

    if ( stack.switch_match || caseValues.indexOf( stack.switch_value ) === -1 ) {
        return '';
    } else {
        stack.switch_match = true;
        return options.fn( this );
    }
} );
Handlebars.registerHelper( "default", function( options ) {
    var stack = Handlebars.__switch_stack__[Handlebars.__switch_stack__.length - 1];
    if ( !stack.switch_match ) {
        return options.fn( this );
    }
} );
{{#switch state}}
    {{#case "page1" "page2"}}page 1 or 2{{/case}}
    {{#case "page3"}}page3{{/case}}
    {{#case "page4"}}page4{{/case}}
    {{#case "page5"}}
            {{#switch s}}
                {{#case "3"}}s = 3{{/case}}
                {{#case "2"}}s = 2{{/case}}
                {{#case "1"}}s = 1{{/case}}
                {{#default}}unknown{{/default}}
            {{/switch}}
    {{/case}}
    {{#default}}page0{{/default}}
{{/switch}}
var data = {
    state : 'page5',
    s : '1'
};

var html = template( data );

이것은 μ–΄λ–€κ°€μš”?
ν‚€λ₯Ό κ°’μœΌλ‘œ λ³€ν™˜ν•˜λ €λŠ” κ²½μš°μ—λ§Œ.

````μžλ°”μŠ€ν¬λ¦½νŠΈ
module.exports = function(μž…λ ₯, μΌ€μ΄μŠ€, κ°’) {
const caseArray = case.split(',')
const valueArray = values.split(',')
μƒμˆ˜ 인덱슀 = caseArray.indexOf(μž…λ ₯)

λ°˜ν™˜ κ°’ λ°°μ—΄[인덱슀]
};
ν•Έλ“€λ°”
{{μŠ€μœ„μΉ˜ "Y" "Y,N,D", "예, μ•„λ‹ˆμ˜€, μ‚­μ œλ¨"}}
````

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰