2015-08-13 2 views
0

Я действительно разрабатываю упрощенное приложение с использованием метеоритов, и я сталкиваюсь с проблемой.Meteor и #each scoping

На самом деле, я м, имеющий шаблон с заявлением #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}}, но ничего не происходит, и я не знаю, что делать на самом деле.

Не могли бы вы мне немного помочь?

ответ

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; 
    } 
    }); 
0

Обычно each используется с курсором, поэтому я собираюсь предположить, что вы использовали это. Вы используете this.users.length, и если this.users - это курсор, вы не должны получать .length. Вы должны попробовать this.users.count().

+0

Я пробовал и не работает. Дело в том, что у меня есть желаемый результат вне поля #each. Когда я console.log (это) внутри моей функции, у меня есть свой дочерний элемент, и я не могу получить доступ к родительской функции. – mfrachet

+0

Возможно, вы можете использовать 'Template.instance(). Data'? – corvid

0

Итак, если вы находитесь внутри каждого блока, ключевое слово this будет ссылаться на один из объектов, которые вы итерируете в блоке {{#each}}. Итак, давайте предположим, что ваш «пользователь» каждого блока - это помощник, который возвращает список пользователей, которые вы подписали на return Meteor.users.find({});. Используя это, в блоке {{#each}} возвращается один пользовательский документ вроде: {name: "eric", occupation: "doctor"} или что бы вы ни подписали. Итак, чтобы получить счетчик каждого пользователя, которого вы используете для блока {{#each}}, вам понадобится помощник, который учитывает все записи. что-то упрощенно может быть: Template.myTemplate.helpers({ userCount: function() { return Meteor.users.find({}).count();} });

Смежные вопросы