Handlebars.js: {{#рд╕реНрд╡рд┐рдЪ}} рд╕рд╣рд╛рдпрдХ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рджрд┐рд╕ре░ 2014  ┬╖  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}}

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

рдпрд╣ рдкреГрд╖реНрда рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рд╣реИрдВрдбрд▓рдмрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╕рд╣рд╛рдпрдХ" рдХреЗ рд▓рд┐рдП рддреАрд╕рд░рд╛ Google рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдПрдХ рдЦреЛрдЬ рдЗрдВрдЬрди рд╕реЗ рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдХреНрд░рд┐рд╕ рдореЙрдиреНрдЯреНрд░реЛрдЗрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдПрдХрд▓-рдореВрд▓реНрдп case рдХреНрд▓реЙрдЬ рдЬреИрд╕реЗ {{#case "page1"}} :

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 рд╣реЗрд▓реНрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХрд┐ {{#case "page1" "page2"}} рдЬреИрд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдирдВрдмрд░ рд╡рд╛рд▓реЗ рдХреНрд▓реЙрдЬ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ:

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 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдорд╛рдирдХ рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (рд╣реИрдХреА рддрд░реАрдХреЗ рд╕реЗ) рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдмрд┐рд▓реНрдЯрд┐рди рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд▓реНрдХрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рд╣реЗрд▓реНрдкрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЗрд▓реНрдкрд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рдкреГрд╖реНрда рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рд╣реИрдВрдбрд▓рдмрд╛рд░ рд╕реНрд╡рд┐рдЪ рд╕рд╣рд╛рдпрдХ" рдХреЗ рд▓рд┐рдП рддреАрд╕рд░рд╛ Google рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдПрдХ рдЦреЛрдЬ рдЗрдВрдЬрди рд╕реЗ рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдХреНрд░рд┐рд╕ рдореЙрдиреНрдЯреНрд░реЛрдЗрд╕ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдПрдХрд▓-рдореВрд▓реНрдп case рдХреНрд▓реЙрдЬ рдЬреИрд╕реЗ {{#case "page1"}} :

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 рд╣реЗрд▓реНрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХрд┐ {{#case "page1" "page2"}} рдЬреИрд╕реЗ рд╡реИрд░рд┐рдПрдмрд▓ рдирдВрдмрд░ рд╡рд╛рд▓реЗ рдХреНрд▓реЙрдЬ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ:

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

@ рдмрд┐рд▓реА- рд╣рдореЗрдВ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

@jimkoul рдпреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрдкрдХреЗ рд╕реЗрдЯ рдЕрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдореЗрд░рд╛ рд╕реЗрдЯ рдЕрдк (рдЧреБрд▓рдк + рдЧрд▓реНрдк-рдПрдЪрдмреА рдХреЗ рд╕рд╛рде) рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд▓реЛрдм рдкреИрдЯрд░реНрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

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

рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реА рдПрдЪрдмреАрдПрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдпрд╣реА рд╣реИ:

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

рд╕реНрд╡рд┐рдЪ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╢рд╛рдЦрд╛ рджреЗрдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдЗрдореНрдмреНрд░рд┐рдХреЗрд╢рди? рд╢рдмреНрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ ...)
рд╕рд╛рде рд╣реА, рдмреНрд░реЗрдХ рд╣рдореЗрд╢рд╛ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╢рд░реНрдд рдкреВрд░реА рд╣реЛрддреА рд╣реИ

рдЕрд░реНрдерд╛рдд:

    {{#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 рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

@ рдмрд┐рд▓реА- @ рдП-рд▓реЗ?

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

рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕рд╛ рд╣реИ?
рдмрд╕ рдЕрдЧрд░ рдЖрдк рдХреБрдВрдЬреА рдХреЛ рдореВрд▓реНрдп рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

````рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдореЙрдбреНрдпреВрд▓.рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ = рдлрд╝рдВрдХреНрд╢рди (рдЗрдирдкреБрдЯ, рдХреЗрд╕, рдорд╛рди) {
рдХреЙрдиреНрд╕реНрдЯ рдХреЗрд╕рдЕрд░реЗ = рдХреЗрд╕ред рд╕реНрдкреНрд▓рд┐рдЯ (',')
const valueArray = value.split(',')
рдХреЙрдиреНрд╕реНрдЯ рдЗрдВрдбреЗрдХреНрд╕ = caseArray.indexOf (рдЗрдирдкреБрдЯ)

рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпрдЕрд░реЗ [рд╕реВрдЪрдХрд╛рдВрдХ]
};
рд╣реИрдВрдбрд▓рдмрд╛рд░
{{рд╕реНрд╡рд┐рдЪ "рд╡рд╛рдИ" "рд╡рд╛рдИ, рдПрди, рдбреА", "рд╣рд╛рдВ, рдирд╣реАрдВ, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛"}}
````

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

jasonh-brimar picture jasonh-brimar  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ