流星和#each范围

时间:2015-08-13 13:52:06

标签: javascript meteor

我实际上正在使用meteorjs开发一个简单的应用程序,我遇到了一个问题。

实际上,我有一个带有#each语句的模板,如下所示:

<template name="insidePlanning">
  <div class="row m-t">
    <div class="backGrey col-md-8">
      <div class="row">
        {{#each users}}
          <div class="col-md-{{countUsersCol}}">
            {{name}}
          </div>
        {{/each}}
      </div>

    </div>

    <div class=" col-md-4">
      <form>
        <div class="form-group">
          <input type="text" name="text" placeholder="Type to add new tasks" class="form-control" />
        </div>
      </form>

      <ul class="list-unstyled">
        {{#each taskNotAffected}}
          <li>{{title}}</li>
        {{/each}}
      </ul>
    </div>
  </div>
</template>

除{{countUsersCol}} ...

外,一切正常

这是我的模板助手:

  Template.insidePlanning.helpers({
    countUsersCol:function(){
      if(this.users){
        return Math.round(12/this.users.length);
      }
      return 0;
    }
  });

事实上,当我将{{countUsersCol}}放在#each语句中时,我总是得到0.如果我把它放在#each上方,它会显示6(我实际需要的值)。因此,总而言之,#each在其声明中创建了一个不同的范围......

我尝试使用{{../countUsersCol}}但没有任何反应,我不知道该怎么做。

你能帮我一点吗?

3 个答案:

答案 0 :(得分:2)

您的users#each阻止数据上下文的一部分:在循环内,this仅包含内容您正在处理的当前单个user文档。您需要使用Template.parentData()才能从帮助程序中获取较高级别的数据。

  Template.insidePlanning.helpers({
    countUsersCol:function(){
      var parentData = Template.parentData(1);
      if(parentData.users){
        return Math.round(12/parentData.users.length);
      }
      return 0;
    }
  });

答案 1 :(得分:0)

通常,each与光标一起使用,所以我假设你使用了它。您使用的是this.users.length,如果this.users是游标,则不应该获得.length。您应该尝试this.users.count()

答案 2 :(得分:0)

因此,当您在每个块内时,this关键字将引用您在{{#each}}块中迭代的其中一个对象。因此,假设您的每个块的“用户”是一个帮助程序,它返回您已经转贴到return Meteor.users.find({});的用户列表。使用此功能,在{{#each}}块中返回一个用户文档,例如:{name: "eric", occupation: "doctor"}或您提交的任何内容。因此,为了获得您为{{#each}}块分配的每个用户的计数,您将需要一个对所有记录进行计数的帮助程序。简单化的东西可能是:Template.myTemplate.helpers({ userCount: function() { return Meteor.users.find({}).count();} });