โค้ดใช้งานได้หลังจากโหลดหน้าเว็บ แต่ไม่ทำงานในระหว่าง

ฉันกำลังพัฒนาแอปสำหรับการใช้งานภายในบริษัท และฉันกำลังเผยแพร่รายชื่อผู้ใช้ที่มีคุณสมบัติเป็น "หัวหน้างาน" (โดยใช้ อลันนิ่ง:บทบาท.)

ฉันยังใช้ 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