Ubah metode meteor yang mengembalikan satu objek ke dalam konteks stang

Dalam contoh papan peringkat dasar di meteor.com terdapat metode yang disebut nama_yang dipilih.

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

Sebaliknya saya ingin mengembalikan seluruh objek pemain dan kemudian objek itu diperlakukan sebagai konteks dengan stang. Saya berharap saya bisa mengatakan ini:

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

Blok #if di atas sebenarnya tidak berfungsi di meteor. Pernyataan #if hanya mengevaluasi metodeselect_person dan {{name}} yang disarangkan tidak melakukan apa pun. Saya ingin tahu apakah mungkin untuk menulis metode sehingga objek yang dikembalikan dapat digunakan sebagai konteks blok #if.


person lashleigh    schedule 15.04.2012    source sumber


Jawaban (2)


Terselesaikan! Jika saya hanya menggunakan #with alih-alih #if maka semuanya berfungsi dengan baik. Seperti yang tertulis di dokumen stang 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 yang disarangkan cukup rumit dan jelas tidak layak dilakukan hanya untuk merender nama, tetapi saya dapat memikirkan saat-saat di mana rendering khusus untuk lebih banyak atribut dari satu objek akan berguna.

person lashleigh    schedule 15.04.2012
comment
Pernyataan if sepertinya tidak diperlukan, sepertinya dengan pegangannya sendiri seperti yang saya harapkan. - person jonathanKingston; 15.04.2012
comment
@jonathanKingston Jika tidak ada orang yang dipilih, ini akan merender div lainnya, yang mungkin bukan yang Anda cari. Dalam kasus penggunaan saya, saya pasti hanya ingin fragmen tersebut dirender jika ada nilai di sana. - person Benson; 16.04.2012
comment
Alternatifnya, gabungkan if dan with menjadi satu helper. Misalnya: Handlebars.registerHelper('ifwith', function(context, options) { if (context) return options.fn(context); });. Dengan cara ini orang_yang dipilih hanya dipanggil satu kali, bukan satu kali karena if dan satu kali karena with. - person Joel Nation; 30.05.2012

Saya melakukan hal serupa seperti ini, tetapi menurut saya itu bukan "cara yang benar"?

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}}
person Josh Petitt    schedule 15.04.2012
comment
Saya melakukan hal seperti itu juga, sampai saya menemukan jawaban lashleigh tentang penggunaan #with. Bekerja seperti pesona. :-) - person Benson; 16.04.2012