2

当我在另一个上下文中时,如何访问流星模板助手中的一个“兄弟”变量?我想确定登录并查看页面的用户是否与发布乘车服务的用户相同,以便我可以相应地隐藏或显示“出价”按钮。

例如,这是我的模板 (html) 文件:

<!-- client/views/ride_offers.html -->
<template name="RideOfferPage">
    <p>UserIsOwner:{{UserIsOwner}}</p>
        {{#with CurrentRideOffer}}
            {{> RideOffer}}
        {{/with}}
</template>

<template name="RideOffer">
  <div class="post">
    <div class="post-content">
      <p><a href="{{RideOfferPagePath this}}">Details</a>, Author: {{author}}, From: {{origin}}, To: {{destination}}, between {{earliest}} and {{latest}} for {{nseats}} person(s). Asking ${{price}}. 
      <a href="{{MakeBidOnOfferPath this}}"><button type="button" class="btn btn-primary" >Bid</button></a><p>
      <p>UserIsOwner:{{UserIsOwner}}</p>
    </div>
 </div>
</template>

这是我的 JavaScript 文件:

Template.RideOfferPage.helpers({ 
    CurrentRideOffer: function() {
        return RideOffers.findOne(Session.get('CurrentOfferId')); 
    },
    UserIsOwner: function() {
        return RideOffers.find({_id: Session.get('CurrentOfferId'), userId: Meteor.userId()}).count() > 0;
    }
});

在“RideOffer”模板中,我可以访问变量author, origin, ..., price。但我无法访问 boolean UserIsOwner。但是,我可以访问UserIsOwner“RideOfferPage”模板中的布尔值。

有谁知道我如何访问UserIsOwner“RideOffer”模板中的布尔值?

干杯,

4

2 回答 2

0

将 userIsOwner 函数作为匿名函数放在帮助程序之外,然后从两个模板中调用它。

Template.RideOfferPage.helpers({ 
  CurrentRideOffer: function() {
    return RideOffers.findOne(Session.get('CurrentOfferId')); 
  },
  UserIsOwner: checkUserIsOwner()
});

Template.RideOffer.helpers({ 
  UserIsOwner: checkUserIsOwner()
});

checkUserIsOwner= function() {
  return RideOffers.find({_id: Session.get('CurrentOfferId'), userId: Meteor.userId()}).count() > 0;
}
于 2013-09-26T07:13:39.243 回答
0

有几种方法可以满足您的要求。

在您的特定示例中,您不是在询问兄弟姐妹,而是询问父母,因为RideOfferPage模板呈现RideOffer模板。您可以像这样访问父数据上下文中的变量(但不是助手):

<template name="RideOffer">
  <div class="post">
    <div class="post-content">
      <!-- 
         other stuff 
       -->
      <p>UserIsOwner:{{../UserIsOwner}}</p>
    </div>
 </div>
</template>

在其他情况下,您可能有一个模板被渲染为这个模板的兄弟。在这种情况下,在模板实际出现在页面上之前,您实际上无法知道兄弟姐妹是什么;但是,您可以在rendered回调中找到它:

Template.foo.rendered = function() {
    var current = this.firstNode;
    var next = $(currentItem).next(); // or .prev()

    if (next.length) {
      nextData = Spark.getDataContext(next[0]);
    }         
    // Do something with nextData
};

最后,您可以通过重复遍历其父元素来获取任何渲染的 DOM 元素的父上下文。这不是超级有效,但我已经在页面上有大量拖放并且DOMFragments 在页面上移动的地方使用了它:

Template.bar.events = {
  "click .something": function(e) {

    var target = e.target;
    var context = Spark.getDataContext(target);
    var parentContext = context;        
    while (parentContext === context) {
      parentContext = Spark.getDataContext(target = target.parentNode);
    }
    // Do something with parentContext
  }
};

我很想知道是否有更好的方法来做最后一件事,这可能需要遍历许多 DOM 元素。无论如何,您可能想查看我的流星自动完成包,了解这个和其他很酷的技巧。

于 2013-09-26T14:17:01.460 回答