来自游标助手的流星数据上下文

时间:2019-01-21 10:42:46

标签: meteor meteor-blaze

我需要显示从游标返回的某个数据字段。据我了解,最好的方法是定义一个帮助程序,然后使用#each标签将数据访问html

当我在助手中使用findOne()时,我只能从一个文档中获得正确的数据结果,如果findOne()的代码如下所示,如何对所有文档都具有相同的结果?(html中的数据上下文在表单元格中)。 findOne代码但html中仅返回一个doc字段:

Template.products.helpers({
  getOffers (){
    result = OffersAggregate.findOne('offeringType-grouping').result[0].offeringType
    return result
  }
});

html代码:

 <td>{{getOffers }}<td>

find()光标帮助器却出现错误结果:

  

“排队任务中的​​异常错误:无法调用非功能:”

Template.products.helpers({
  getOffers (){
    return OffersAggregate.find().fetch()
  }
});
            <table id="table" class="table table-hover table-bordered">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Price</th>
                        <th>Country</th>                                
                        <th>Number of Offers</th>
                        <th>Offers</th>
                    </tr>
                </thead>
                <tbody>     
                    {{#each Product in Products}}   

                        <tr>
                            <td>{{Product.Name}}</td>
                            <td>{{Product.Price}}</td>
                            <td>{{Product.Country}}</td>
                            <td>{{Product.Number}}</td>
                            {{#each  offer in getOffers}}
                                {{#each result in offer.result  }}  
                                    <td>{{result.offeringType}}</td>
                                {{/each}}
                            {{/each}}   
                        </tr>
                    {{/each}}                           
                </tbody>
            </table>

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的OffersAggregate文档,则应该可以进行以下操作:

模板助手:

Template.products.helpers({
  getOffers (){
    return OffersAggregate.find().fetch();
  }
});

注册新的模板助手:

Template.registerHelper('returnValueByIndex', function (array, index){
   return array[index];
});

显示:

<table id="table" class="table table-hover table-bordered">
<thead>
 <tr>
  <th>Name</th>
  <th>Price</th>
  <th>Country</th>
  <th>Number of Offers</th>
  <th>Offers</th>
 </tr>
</thead>
<tbody>
 {{#each Product}}
 <tr>
  <td>{{Name}}</td>
  <td>{{Price}}</td>
  <td>{{Country}}</td>
  <td>{{Number}}</td>
  <td>
  {{#with returnValueByIndex Product.[0].getOffers.[0].result @index}}
   {{this.offeringType}}
  {{/with}}
 </td>
 </tr>
 {{/each}}
</tbody>

答案 1 :(得分:1)

注意:自从Mo A的答案出现以来,就给予了感谢。

{{#each}}的上下文需要一个iterable,它可以是数组或游标(或nullundefined之类的false值可以跳过每个块)

阅读:http://blazejs.org/guide/spacebars.html#Each-and-With

集合上的函数Collection.findOne立即返回文档。这是流星Collection.find().limit(1).fetch()[0]中方便的快捷方式。

因此,对于您的用例,它是find(),并且使用了正确的过滤器。您描述的错误与find无关,但与模板代码有关:

{{#each getOffers}}
  <!-- this will be inside a blick a reference to the current element -->
  {{#each this.result}}
    <!-- this is now refering to the result property on the current element -->
    {{#each offeringType}}<td>{{this}}</td>{{/each}}
  {{/each}}
{{/each}}

您只需要简单地思考一下,在eachwith块中,this属性就是当前文档。要使您的each更加易于推理,可以使用each var in iterable

{{#each offer in getOffers}}
  {{#each result in offer.result}}
    {{#each offeringType in result}}<td>{{offeringType}}</td>{{/each}}
  {{/each}}
{{/each}}

更多信息:http://blazejs.org/guide/reusable-components.html(“首选{{##。in}}”部分)