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 块实际上在meteor 中不起作用。#if 语句只是评估 selected_person 方法,而嵌套的 {{name}} 绝对什么都不做。我想知道是否可以编写一个方法,以便可以将返回的对象用作#if 块的上下文。

4

2 回答 2

7

解决了!如果我只使用#with 而不是#if,那么一切都会很好。正如车把文档中所说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 回答