2012-04-15 5 views
4

Im grundlegenden Leaderboard-Beispiel auf meteor.com gibt es eine Methode namens selected_name.Wenden Sie eine Meteormethode an, die ein einzelnes Objekt in einen Kontext für den Lenker zurückversetzt.

Template.leaderboard.selected_name = function() { 
    var player = Players.findOne(Session.get("selected_player")); 
    return player && player.name; 
    }; 

    {{#if selected_name}} 
    <div class="details"> 
    <div class="name">{{selected_name}}</div> 
    <input type="button" class="inc" value="Give 5 points" /> 
    </div> 
    {{/if}} 

Stattdessen möchte ich das gesamte Spielerobjekt zurückgeben und dann dieses Objekt als Kontext von Lenker behandelt werden. Ich wünschte, ich könnte das sagen:

Der #if Block oben funktioniert nicht wirklich in Meteor. Die #if-Anweisung bewertet nur die selected_person-Methode, und das verschachtelte {{name}} tut absolut nichts. Ich würde gerne wissen, ob es möglich ist, eine Methode zu schreiben, so dass das zurückgegebene Objekt als Kontext eines #if-Blocks verwendet werden kann.

Antwort

7

Gelöst! Wenn ich nur #with statt #if benutze, dann funktioniert alles super. Wie heißt es in den Lenker docs You can shift the context for a section of a template by using the built-in with block helper.

{{#if selected_person}} 
    {{#with selected_person}} 
    <div class="details"> 
    <div class="name">{{name}}</div> 
    <input type="button" class="inc" value="Give 5 points" /> 
    </div> 
    {{/with}} 
    {{/if}} 

Die verschachtelte if/mit recht umständlich ist und eindeutig nicht wert, für sie nur den Namen zu machen, aber ich konnte für mehrere Attribute eines einzelnen Objekts von Zeiten, in denen spezielle Rendering denken wäre nützlich.

+0

Die if-Anweisung scheint nicht benötigt zu werden, sieht aus wie die mit eigenen Handles, die, wie ich es erwartet hätte. – jonathanKingston

+0

@jonathanKingston In einem Fall, in dem es keine ausgewählte Person gibt, wird der Rest der divs gerendert, was möglicherweise nicht das ist, wonach Sie suchen. In meinem Anwendungsfall möchte ich das Fragment nur dann rendern, wenn dort ein Wert vorhanden ist. – Benson

+1

Alternativ kombinieren Sie das If und das mit in einem Helfer. ZB: 'Handlebars.registerHelper ('ifwith', Funktion (Kontext, Optionen)) { \t if (Kontext) return options.fn (Kontext); });'. Auf diese Weise wird die selected_person nur einmal aufgerufen, und nicht nur einmal wegen des if und einmal wegen des with. –

0

Ich habe eine ähnliche Sache gemacht, aber ich denke nicht, dass es der "richtige Weg" ist?

+0

Ich habe auch so etwas gemacht, bis ich die Antwort von lashleigh über #with gefunden habe. Klappt wunderbar. :-) – Benson

Verwandte Themen