2013-02-26 13 views
37

Wie würden Sie den folgenden Code ändern, damit es funktioniert? Das Problem ist, die diese == Ausdruck 'eine Botschaft':Handlebars.js wenn Block Helfer ==

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

Antwort

78

Die einfachste Sache wäre eine benutzerdefinierte if_eq Helfer hinzuzufügen:

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

und passen Sie Ihre Vorlage:

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

Demo: http://jsfiddle.net/ambiguous/d4adQ/

Wenn Ihre errors Eingaben waren nicht einfache Strings dann könnte man hinzufügen, „ist dies eine Nachricht“ Fahnen zu ihnen und eine Standard-{{#if}} verwenden (beachten Sie, dass direkt in einen String eine Eigenschaft hinzugefügt wird nicht so gut funktionieren):

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

und:

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

Demo: http://jsfiddle.net/ambiguous/9sFm7/

+0

Wenn '{{#if_eq dieses "some Nachricht"}}' funktioniert, warum nicht 'dies. etwas Eigenschaft? Ich kann das nicht zur Arbeit bringen. – raffian

+0

@raffian: Hast du ein Beispiel (vielleicht eine Modifikation eines der Geigen in der Antwort) von dem, was du versuchst zu tun? –

+0

..wurde eine Geige gebaut, dann bemerkte ich, dass mein persönlicher Helfer endete mit '{{if}}', nicht '{{if_eq}}', unglaublich, verschwendete Stunden, aber danke, dass du mir die Augen geöffnet hast: -) – raffian

9

alte Frage, aber wenn Sie verwenden Elving der Swag Handlebars helpers library, können Sie die Helfer is und isnt nutzen können.

+0

Absolut erstaunlich! –

+0

Diese Bibliothek ist sehr nützlich! – caballerog

5

Dies kann auch erreicht werden mit Lenker Subexpressions.

Template -

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

Arbeits Demo: http://jsfiddle.net/techgeeek/b99qwtpw/

+0

Für die Wiederverwendbarkeit wäre es sinnvoller, den Helfer is_equal oder etwas in diesem Sinne zu nennen, kein Punkt, der ihn direkt an den Status bindet. –

Verwandte Themen