4

meteor.comの基本的なリーダーボードの例には、selected_nameというメソッドがあります。

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

代わりに、プレーヤーオブジェクト全体を返し、そのオブジェクトをハンドルバーによってコンテキストとして処理させたいと思います。私はこれを言うことができればいいのに:

  Template.leaderboard.selected_person = function () {
    var player = Players.findOne(Session.get("selected_player"));
    return player || false;
  };

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

上記の#ifブロックは、実際には流星では機能しません。#ifステートメントはselected_personメソッドを評価しているだけであり、ネストされた{{name}}はまったく何もしません。返されたオブジェクトを#ifブロックのコンテキストとして使用できるようにメソッドを作成できるかどうかを知りたいです。

4

2 に答える 2

7

解決しました!#ifの代わりに#withを使用すると、すべてがうまく機能します。ハンドルバーのドキュメントにあるように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}}

ネストされたif/withは非常に面倒で、名前をレンダリングするだけでは明らかに価値がありませんが、単一のオブジェクトのより多くの属性の特別なレンダリングが役立つ場合が考えられます。

于 2012-04-15T08:39:01.573 に答える
0

私も同じようなことをしましたが、それが「正しい方法」ではないと思いますか?

Template.leaderboard.selected_person = function () {
    return Players.find(Session.get("selected_player"));
};

{{#each selected_person}}
<div class="details">
    <div class="name">{{name}}</div>
    <input type="button" class="inc" value="Give 5 points" />
</div>
{{/each}}
于 2012-04-15T18:23:19.863 に答える