เปลี่ยนเมธอด meeor เพื่อส่งคืนวัตถุเดี่ยวให้เป็นบริบทสำหรับแฮนด์บาร์

ในตัวอย่างลีดเดอร์บอร์ดพื้นฐานบน 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 ได้


person lashleigh    schedule 15.04.2012    source แหล่งที่มา


คำตอบ (2)


แก้แล้ว! ถ้าฉันแค่ใช้ #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 นั้นค่อนข้างยุ่งยากและเห็นได้ชัดว่าไม่คุ้มกับการแสดงชื่อเท่านั้น แต่ฉันสามารถนึกถึงเวลาที่การเรนเดอร์พิเศษสำหรับคุณลักษณะเพิ่มเติมของวัตถุเดียวจะมีประโยชน์

person lashleigh    schedule 15.04.2012
comment
ดูเหมือนว่าไม่จำเป็นต้องใช้คำสั่ง if ดูเหมือนว่าจะมีตัวจัดการอย่างที่ฉันคาดหวังไว้ - person jonathanKingston; 15.04.2012
comment
@jonathanKingston ในกรณีที่ไม่มีบุคคลที่เลือก มันจะแสดงผล div ที่เหลือซึ่งอาจไม่ใช่สิ่งที่คุณกำลังมองหา ในกรณีการใช้งานของฉัน ฉันต้องการให้แฟรกเมนต์แสดงผลเฉพาะในกรณีที่มีค่าอยู่ที่นั่นเท่านั้น - person Benson; 16.04.2012
comment
หรือรวม if และ the with เข้าไว้ในตัวช่วยตัวเดียว เช่น: Handlebars.registerHelper('ifwith', function(context, options) { if (context) return options.fn(context); }); วิธีนี้ select_person จะถูกเรียกเพียงครั้งเดียว แทนที่จะเป็นครั้งเดียวเพราะถ้าและครั้งเดียวเพราะด้วย - person Joel Nation; 30.05.2012

ฉันทำสิ่งที่คล้ายกันเช่นนี้ แต่ฉันไม่คิดว่ามันจะเป็น "วิธีที่ถูกต้อง"?

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
ฉันก็ทำแบบนั้นเหมือนกัน จนกระทั่งเจอคำตอบของ lashleigh เกี่ยวกับการใช้ #with ทำงานเหมือนมีเสน่ห์ :-) - person Benson; 16.04.2012