Handlebars.js: рдХреНрдпрд╛ рдореИрдВ рдПрдХ рд╣реА рдЯреИрдЧ рдореЗрдВ рдПрдХрд╛рдзрд┐рдХ рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рд╕рд┐рддре░ 2012  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: handlebars-lang/handlebars.js

рдЬреИрд╕реЗ {{ helper1 helper2 text }} , рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдореВрд▓ рд╕рдорд░реНрдерди рд╣реИ:

{{ helper1 (helper2 text) }}

рд╕рднреА 17 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: {{headerText {{getTitle "my_page"}}}} ред

рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╕рд╣рд╛рдпрдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдЬрдВрдЬреАрд░ рджреЗрддрд╛ рд╣реИ:

{{chain "helper1" "helper2" text}}

рдЕрдЧрд░ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдРрд╕рд╛ рд╕рд╣рд╛рдпрдХ рдмрдирд╛рдпрд╛ рд╣реИ:

Handlebars.registerHelper('chain', function () {
    var helpers = [], value;
    $.each(arguments, function (i, arg) {
        if (Handlebars.helpers[arg]) {
            helpers.push(Handlebars.helpers[arg]);
        } else {
            value = arg;
            $.each(helpers, function (j, helper) {
                value = helper(value, arguments[i + 1]);
            });
            return false;
        }
    });
    return value;
});

рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

{{chain "taxAdd" "formatPrice" this.product.price}}

@Znarkus рдЬреЛ jQuery рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ

@jrajan рдореИрдВрдиреЗ рдХреЗрд╡рд▓ jQuery.each , рдЬреЛ рднреА рдЖрдкрдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рд╣реИрдВ, рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ jQuery рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ:

Handlebars.registerHelper('chain', function() {
  var helpers = [];
  var args = Array.prototype.slice.call(arguments);
  var argsLength = args.length;
  var index;
  var arg;

  for (index = 0, arg = args[index];
       index < argsLength;
       arg = args[++index]) {
    if (Handlebars.helpers[arg]) {
      helpers.push(Handlebars.helpers[arg]);
    } else {
      args = args.slice(index);
      break;
    }
  }

  while (helpers.length) {
    args = [helpers.pop().apply(Handlebars.helpers, args)];
  }

  return args.shift();
});

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

рдпрд╣рд╛рдВ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рд╡реЗ рджреЛрдиреЛрдВ рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рддреНрдпреЗрдХ рд╕рд╣рд╛рдпрдХ рдХреЛ рдХрдИ рддрд░реНрдХ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рд╡реЗ рдХреЙрдлреА-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рднреА рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдпрд╛ рд▓реЙрд╢ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред

рдкрд╣рд▓рд╛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
{{{chain 'join-strings' 'link-twitter-handles' '@' twitterUsername}}}
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛:
{{{chain 'join-strings' 'link-twitter-handles' '@' 'join-strings' twitterUsername}}}

Handlebars.registerHelper 'chain', ->
    # Get rid of the options hash
    args = Array.prototype.slice.call arguments, 0, -1
    helpers = []
    argsForHelpers = null
    value = undefined

    _.each args, (arg, i) ->
        if Handlebars.helpers[arg]
            helpers.push Handlebars.helpers[arg]
        else if not value # Only call the helpers once
            value = arg
            unless argsForHelpers
                argsForHelpers = args[i+1..-1]
                argsForHelpers.unshift value
            _.each helpers, (helper) ->
                argsForHelpers[0] = value
                value = helper.apply null, argsForHelpers

    value

рдЗрд╕ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рд╣реИ рдЬреЛ chain рдХреЛ рддрд░реНрдХреЛрдВ рд╕реЗ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рд╕рд╣рд╛рдпрдХ рдпрд╣ рдорд╛рди рд▓реЗрдЧрд╛ рдХрд┐ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд╕рд╛рдордиреЗ рд╣рд░ рддрд░реНрдХ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╣реИ рдФрд░ рдЕрдиреНрдп рд╕рднреА рдХреЛ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

Handlebars.registerHelper 'chain', ->
    # Get rid of the options hash
    args = Array.prototype.slice.call arguments, 0, -1
    helpers = []

    for arg,i in args
        if arg is '--'
            argsForHelpers = args.slice i + 1
            value = argsForHelpers[0]
            break
        else
            helpers.push Handlebars.helpers[arg]

    _.each helpers, (helper) ->
        argsForHelpers[0] = value
        value = helper.apply null, argsForHelpers

    value

рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП:
{{{chain 'join-strings' 'link-twitter-handles' '@' 'join-strings' twitterUsername}}}
рдФрд░ рдпрд╣ рд╡рд╕реНрддреБ:
{twitterUsername: 'abc'}
рд╣рдо рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕рдВрдХрд▓рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<a href="https://twitter.com/join-stringsabc">@join-stringsabc</a>

рдореИрдВрдиреЗ @cdata рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмреНрд▓реЙрдХ

/**
 * Takes an arbitrary number of arguments, the first of which is the operation type 'AND' or 'OR'.
 * Following that will be a list of block helper names prefixed by '!!'.
 * Calls each block helper with the remaining arguments.
 *
 * <strong i="7">@returns</strong> {string}  returns options.fn(this) or options.inverse(this) depending on result of each helper and operation type
 */
Handlebars.registerHelper('chainBlockHelpers', function() {
    var index, arg, helperResult, pass,
        helpers = [],
        args = Array.prototype.slice.call(arguments),
        argsLength = args.length,
        options = args[argsLength-1],
        operation = args.shift(),
        passVal = options.fn(this),
        failVal = options.inverse(this);

    if (operation !== 'AND' && operation !== 'OR')
        throw new Error ('chainBlockHelpers only supports "AND" or "OR" operations.')

    for (index = 0, arg = args[index]; index < argsLength; arg = args[++index]) {
        if (typeof arg == 'string' && arg.startsWith('!!') && Handlebars.helpers[arg.substr(2)]) {
            helpers.push(Handlebars.helpers[arg.substr(2)]);
        } else {
            args = args.slice(index);
            break;
        }
    }

    if (operation === 'AND') {
        pass = true;
        while (helpers.length) {
            helperResult = helpers.pop().apply(Handlebars.helpers, args);
            if (helperResult == failVal) {
                pass = false;
                break;
            }
        }
    } else {
        pass = false;
        while (helpers.length) {
            helperResult = helpers.pop().apply(Handlebars.helpers, args);
            if (helperResult == passVal) {
                pass = true;
                break;
            }
        }
    }

    return pass ? passVal : failVal;
});

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдореВрд▓ рд╕рдорд░реНрдерди рд╣реИ:

{{ helper1 (helper2 text) }}

рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдЕрдкрдиреЗ рд╕рд╣рд╛рдпрдХреЛрдВ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

{{#helper1}}{{helper2}}content{{/helper2}}{{/helper1}}

@Znarkus рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрдм рдореИрдВ рджреЛ рд╕рд╣рд╛рдпрдХреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдореЗрд░рд╛ рдХреЛрдб рдмреНрд░реЗрдХ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдЬреЛ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╡рд╕реНрддреБ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? рдореЗрд░реЗ рдбреАрдмрдЧрд░ рдореЗрдВ рдпрд╣ 'рдирд╛ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдФрд░ рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ:' рдорд╛рдИ рд╡реИрд▓реНрдпреВ' рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ; рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ SafeString рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдкрд╛рд╕ рдХрд░рдирд╛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

    Handlebars.registerHelper('shortNumber', function (value) {
        //return new Handlebars.SafeString(iSpot.number.shortNumber(value)); // Breaks
        return iSpot.number.shortNumber(value);  // Works
    });
    Handlebars.registerHelper('asDollars', function (value) {
        //return new Handlebars.SafeString(iSpot.number.asDollars(value)); // Breaks
        return iSpot.number.asDollars(value); // Works
    });

+1 @amwmedia рджреГрд╖реНрдЯрд┐рдХреЛрдг - {{pluralize (titleize (humanize schema.name))}}

+1 рдЬреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдл рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

+1 @amwmedia рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж

@breandr / @amwmedia рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ @cssagogo рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ Handlebars.SafeString() w/o рд╣реИред

рддреЛ рдЖрдк рд╕реНрдорде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╕рдВрдж:

{{> partial text=(concat value (default extension 'PDF')) }}

рдзрдиреНрдпрд╡рд╛рдж

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

рдореИрдВ рдЕрдкрдиреЗ рд╕рднреА рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ рдореЗрдВ рд░рдЦрддрд╛ рд╣реВрдВред рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реИрдВ, рдореИрдВ рдорд╛рди рдХреЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдореЗрд░реЗ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рднреА рдЕрдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП:

{{ function1 value }}

рд╕рд╣рд╛рдпрдХ рдлрд╝рд╛рдЗрд▓

function2 (value) {
   // code
}

function1 (value) {
   // code
   function2(value)
   // code
   return value;
}

рдмреЗрд╢рдХ, рдпрд╣ рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдЖрдк рдПрдХ рдЖрдзрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ "рдЪреЗрдирд░" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

{{ chainer value }}

рд╕рд╣рд╛рдпрдХ рдлрд╝рд╛рдЗрд▓

function1 (value) {
   // code
}
function2 (value) {
   // code
}
function3 (value) {
   // code
}
function4 (value) {
   // code
}

function chainer(value) {
   function1(value)
   function2(value)
   function3(value)
   function4(value)
   return value;
}

рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

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

рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдордмреИрдХ :)

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

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

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

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

ustun picture ustun  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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