2013-02-26 3 views
37

Как вы бы изменили следующий код, чтобы заставить его работать? Проблема в том, это == выражение 'какое-то сообщение':Handlebars.js if block helper ==

<ul> 
    {{#each errors}} 
    {{#if (this == 'some message') }} 
    <li>Status</li> 
    {{else}} 
    <li>{{this}}</li> 
    {{/if}} 
    {{/each}} 
</ul> 

ответ

78

Легче всего было бы добавить пользовательские if_eq помощника:

Handlebars.registerHelper('if_eq', function(a, b, opts) { 
    if(a == b) // Or === depending on your needs 
     return opts.fn(this); 
    else 
     return opts.inverse(this); 
}); 

, а затем настроить шаблон:

{{#if_eq this "some message"}} 
    ... 
{{else}} 
    ... 
{{/if_eq}} 

Демонстрация: http://jsfiddle.net/ambiguous/d4adQ/

Если ваш errors записи не были простыми строками, то вы можете добавить «это какой-сообщение» флаги на них и использовать стандартный {{#if}} (обратите внимание, что добавление свойства непосредственно в строку не будет работать, что хорошо):

for(var i = 0; i < errors.length; ++i) 
    errors[i] = { msg: errors[i], is_status: errors[i] === 'some message' }; 

и:

{{#if is_status}} 
    <li>Status</li> 
{{else}} 
    <li>{{msg}}</li> 
{{/if}} 

Демо: http://jsfiddle.net/ambiguous/9sFm7/

+0

Если '{{#if_eq этого "какое-то сообщение"}}' работ, почему не 'это. someProperty'? Не могу заставить это работать. – raffian

+0

@raffian: У вас есть пример (возможно, модификация одного из скриптов в ответе) того, что вы пытаетесь сделать? –

+0

.. строил скрипку, а затем заметил, что мой пользовательский помощник закончил '{{/ if}}', а не '{{/ if_eq}}', невероятно, потратил впустую на это, но спасибо, что открыл мои глаза:) – raffian

9

Старый вопрос, но если вы используете Elving-х Swag Handlebars helpers library, вы можете использовать хелперы is и isnt.

+0

Абсолютно замечательно! –

+0

Эта библиотека очень полезна! – caballerog

5

Это также может быть достигнуто с помощью ручек Subexpressions.

Шаблон -

<script id="tmplStatus" type="text/x-handlebars"> 
     <ul> 
      {{#each errors}} 
       {{#if (is_status this 'some message')}} 
        <li>Status</li> 
       {{else}} 
        <li>{{this}}</li> 
       {{/if}} 
      {{/each}} 
     </ul> 
    </script> 

Javascript -

var errors = [ 
     'Where is pancakes house?', 
     'some message', 
     'One cent stamp' 
    ]; 

    Handlebars.registerHelper('is_status', function(msg, matchMsg, options) 
    { 
     if(msg === matchMsg) 
      return true; 
     else 
      return false; 
    }); 

    var tmplStatus = Handlebars.compile($('#tmplStatus').html()), 
     domStatus = tmplStatus({ errors: errors }); 
    $('body').append(domStatus); 

Рабочая Демо: http://jsfiddle.net/techgeeek/b99qwtpw/

+0

Для повторного использования было бы разумнее называть помощника is_equal или что-то в этом роде, без привязки к статусу. –

Смежные вопросы