Handlebars.js: 단일 νƒœκ·Έμ—μ„œ μ—¬λŸ¬ λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

에 λ§Œλ“  2012λ…„ 09μ›” 07일  Β·  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}}

jQuery에 쒅속성을 λ„μž…ν•˜λŠ” @Znarcus

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

두 κ΅¬ν˜„μ˜ ν•œ 가지 λ¬Έμ œλŠ” μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. 인수 쀑 ν•˜λ‚˜κ°€ λ„μš°λ―Έμ— μ „λ‹¬λ˜λŠ” κ°’μœΌλ‘œ μ˜λ„λ˜μ—ˆμ§€λ§Œ κΈ°μ‘΄ λ„μš°λ―Έμ˜ 이름과 μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄(κ°•μ œ κ°€λŠ₯)인 경우 예기치 μ•Šμ€ κ²°κ³Όκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ‹€μŒμ€ 두 가지 κ΅¬ν˜„μž…λ‹ˆλ‹€. λ‘˜ λ‹€ 이전 μ˜ˆμ œμ™€ 달리 각 λ„μš°λ―Έμ— μ—¬λŸ¬ 인수λ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.
그듀은 λ˜ν•œ 컀피 슀크립트둜 μž‘μ„±λ˜μ—ˆμœΌλ©° 밑쀄 λ˜λŠ” lodash에 μ˜μ‘΄ν•©λ‹ˆλ‹€.

첫 λ²ˆμ§ΈλŠ” λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
{{{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() κ°€ μ—†μŠ΅λ‹ˆλ‹€ .

κ·Έλž˜μ„œ 당신은 smthλ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 처럼:

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

λ‚˜λŠ” 이것을 μ§μ ‘ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 그것이 μž‘λ™ν•˜μ§€ μ•ŠλŠ” 이유λ₯Ό λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μ°Έκ³  HTMLμ—μ„œ μ‚¬μš©ν•˜λ €λŠ” ν•¨μˆ˜λ₯Ό ν•Έλ“€λ°” λ„μš°λ―Έλ‘œ λ“±λ‘ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. λ‚˜λŠ” 개인적으둜 μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ‚΄ λͺ¨λ“  것을 λ“±λ‘ν–ˆμ§€λ§Œ 직접 μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμœΌλ©΄ λ“±λ‘ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

절차적 ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œμ˜ νšŒκ·€ :)

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