Код работает после загрузки страницы, но не во время

Я работаю над приложением для внутреннего использования компанией и публикую список пользователей, которые квалифицируются как «руководители» (используя аланнинг:роли.)

Я также использую useraccounts:bootstrap для сбора дополнительной информации о каждом пользователе во время регистрации, например, кто является его руководителем.

У меня есть функция, которая возвращает нужную мне информацию, но она работает только тогда, когда я запускаю ее в консоли браузера после загрузки сайта.

Если я соберу массив вручную и верну его, все будет работать как положено. Дело, конечно, в том, что это должно быть динамичным и расти по мере роста пользовательской базы.

Все, что я знаю, это то, что код работает не в том контексте/порядке, в котором я думаю. Я пробовал разные вещи, просто чтобы посмотреть, что произойдет, например, перемещение routes.js в /lib (из /client), перемещение определения функции в другой файл и многое другое!

Как я могу это исправить? Я новичок в Meteor, поэтому вполне возможно, что я совершаю какую-то другую огромную ошибку, и эта трудность, с которой я сталкиваюсь, является лишь симптомом этого. Если да, пожалуйста, дайте мне знать!

/server/publications.js

Meteor.publish('supervisor-list', function() {
  var criteria = {
    roles: {$in: ['supervisor']}
  };
  var options = {
    fields: {
      'profile.firstName': 1
      , 'profile.lastName': 1
    }
  };
  return Meteor.users.find(criteria, options);
});    

/client/routes.js

Router.configure({
  layoutTemplate:     'layout'
  , loadingTemplate:  'loading'
  , notFoundTemplate: '404'
  , waitOn:           function () {
    return [
      Meteor.subscribe('transactions')
      , Meteor.subscribe('supervisor-list')
    ];
  }
  , yieldTemplates:   {
    nav:      {to: 'nav'}
    , footer: {to: 'footer'}
  }
});

/lib/1functions.js

getSupervisors = function () {
  var output = [];
  var supervisors = Meteor.users.find().fetch();

  for (var i = 0; i < supervisors.length; i++) {
    output.push({
      text:    supervisors[i].profile.firstName + ' ' + supervisors[i].profile.lastName
      , value: supervisors[i]._id
    });
  }

  //output = [
  //  {text: 'Person One', value: 'personone'}
  //  , {text: 'Person Two', value: 'persontwo'}
  //  , {text: 'Person Three', value: 'personthree'}
  //];

  return output;
};

/lib/at_config.js

AccountsTemplates.addField({
  _id: 'supervisorEmail'
  , type: 'select'
  , select: getSupervisors()
  , required: true
});

person giraffeslacks    schedule 25.07.2015    source источник


Ответы (1)


Просмотрите документацию Meteor (прокрутите немного вниз до "Порядок загрузки файлов") . /lib/at_config.js загружается перед /lib/functions.js, поэтому getSupervisors в этот момент еще не определено.

Не уверен, как устроен ваш код в целом, поэтому я не могу дать никаких указаний относительно того, как бы я это сделал. Документация — ваш друг здесь.

person Oskar    schedule 25.07.2015
comment
Это была глупая ошибка с моей стороны. Я пропустил 1 в имени файла. Файл на самом деле называется 1functions.js из-за этой проблемы с порядком загрузки. - person giraffeslacks; 26.07.2015
comment
Было бы плохой идеей поместить вывод функции в переменную сеанса, когда isServer, а затем получить его в isClient? ... Хорошо, это не работает, потому что это только клиент. - person giraffeslacks; 26.07.2015