2012-06-29 17 views
13

Ich habe ein Controller-Objekt, das wie ist:Ist es möglich, Funktion in Lenker #if zu verwenden?

MyApp.objController = Ember.ArrayController.create({ 
    init: function(data) { 
    data.isValid = function() { 
     return (data.validity === "valid"); 
    } 
    this.pushObject(MyApp.MyObj.create(data)); 
    } 
}); 

Meine Ansicht wie ist:

{{#each MyApp.objController}} 
    {{#if isValid}} 
    <some markup> 
    {{else}} 
    <some other markup> 
    {{/if}} 
{{/each}} 

ich, dass die if bedingten in Lenkern beiden Werte und Funktionen akzeptiert wurde angenommen, aber dies scheint nicht um so zu sein. Ist es wirklich möglich, und ich mache es nur falsch?

Antwort

5

Wenn Sie Ihren isValid als property definieren, können Sie es in Ihrem if Anweisung ohne das Erstellen eines benutzerdefinierten Lenker Helfer verwenden können, finden http://jsfiddle.net/pangratz666/Dq6ZY/:

Lenker:

<script type="text/x-handlebars" data-template-name="obj-template" > 
    {{view Ember.TextField valueBinding="age" }} 
    {{#if isValid}} 
     Si Si. 
    {{else}} 
     Nope! 
    {{/if}} 
</script>​ 

JavaScript:

App.MyObj = Ember.Object.extend({ 
    isValid: function() { 
     return this.get('age') >= 18; 
    }.property('age') 
}); 

Ember.View.create({ 
    templateName: 'obj-template', 
    controller: App.MyObj.create({ 
     age: 21 
    }) 
}).append(); 

+0

Süß! Vielen Dank! Funktioniert besser als meine Methode, eine 'berechnete' Eigenschaft zu verwenden – Jay

-1

Sie könnten hierfür einen benutzerdefinierten Lenker-Helfer erstellen.

+0

ich für ein wenig Hoffnung, wurde mehr Details ... Ich habe in einem Monat nichts mit Lenker gemacht, also habe ich vergessen das meiste von dem, was ich wusste: P. Werde zurückkommen und dies akzeptieren, wenn ich zu diesem Teil meines Projekts zurückkomme und es versuche. – Jay

5

Lenker if-Anweisungen werden nur verglichen, wenn ein Wert existiert, wenn es ein falscher Wert ist (dh nicht vorhanden, 0, ein leerer String usw.). Sie müssen eine benutzerdefinierte Hilfsfunktion schreiben.

Sie könnten es tun, wie diese

Handlebars.registerHelper('isValid', function (value, options) { 
    if (value == "valid") { 
     return options.fn(this); 
    } 
    return options.inverse(this); 
}); 

Dieser einen Block Helfer registriert. Wenn der Wert, den Sie übergeben, als "gültig" bewertet wird, wird die Vorlage zurückgegeben, die auf den Helper mit den aktuellen Daten folgt. Wenn es nicht gültig ist, gibt es die Vorlage zurück, die auf die else-Anweisung mit den aktuellen Daten folgt.

Dann in Ihrer Vorlage können Sie es wie diese verwenden

{{#each MyApp.objController}} 
    {{#isValid validity}} 
     <some markup> 
    {{else}} 
     <some other markup> 
    {{/isValid}} 
{{/each}} 

Andernfalls, wenn Sie durch den Geist der Lenker und tun eine ‚Logik-less‘ Vorlage, ein Flag halten wollte, bevor Sie das machen Vorlage, die angibt, ob diese Daten gültig sind oder nicht, dann verwenden Sie den Lenker, wenn Helfer mit der Flagge.

Sie könnten auch eine generische Funktion einrichten, um diesen und andere Fälle zu behandeln. Siehe meine Antwort in Logical operator in a handlebars.js {{#if}} conditional für ein Beispiel für eine generische if (ähnlich der obigen Antwort)

+0

Es sieht aus wie in Ember 1.5.1+ das ist keine Option mehr. – jevon

+0

Das Ende von '{{if}}' funktionierte nicht für mich, endete aber in '{{/ isValid}}'. Nicht sicher, ob das etwa 2,5 Jahre später ist oder was, aber ich wollte es einfach rauswerfen. – Galen

+0

Ja, das ist ein Tippfehler. Korrigiert. –

-3

Try this:

<ul> 
    {{#each subsites}} 
     {{#if this}} 
     <li>{{{WhatIsTheSiteFor this}}}</li> 
     {{else}} 
     <li>no found</li> 
     {{/if}} 
    {{/each}} 
</ul> 

hier ist Helferfunktion für WhatIsTheSiteFor:

  Handlebars.registerHelper('WhatIsTheSiteFor', function(sitename) { 
      var subsitename = '', 
      sitenamestr = ''; 
      $.each(sitename, function(i, item){ 
        sitenamestr += item; 
        return sitenamestr; 
      }); 
      if(sitenamestr==='s.gbin1.com'){ 
      subsitename = '<a href="http://'+ sitenamestr +'">GB搜索引擎</a>'; 
      }else if(sitenamestr==='m.gbin1.com'){ 
      subsitename = '<a href="http://'+ sitenamestr +'">GB手机阅读</a>'; 
      }else if(sitenamestr==='rss.gbin1.com'){ 
      subsitename = '<a href="http://'+ sitenamestr +'">RSS消息订阅</a>'; 
      } 
      return subsitename; 
     }); 

Hier ist die Demo: http://www.gbin1.com/gb/networks/uploads/71bb1c1e-0cd3-4990-a177-35ce2612ce81/demo6.html

+0

Schlecht formatierter und kontextloser Code. Wäre sehr hilfreich, wenn Erklärungen hinzugefügt werden. – Jeanno

Verwandte Themen