Kode berfungsi setelah pemuatan halaman tetapi tidak selama

Saya sedang mengerjakan aplikasi untuk penggunaan internal perusahaan dan saya menerbitkan daftar pengguna yang memenuhi syarat sebagai "supervisor" (menggunakan alanning:peran.)

Saya juga menggunakan useraccounts:bootstrap untuk mengumpulkan informasi tambahan dari setiap pengguna saat pendaftaran seperti siapa supervisor mereka.

Saya memiliki fungsi yang mengembalikan informasi yang saya perlukan tetapi hanya berfungsi ketika saya menjalankannya di konsol browser setelah situs dimuat.

Jika saya membuat array secara manual dan mengembalikannya, semuanya berfungsi seperti yang diharapkan. Intinya, tentu saja, hal ini harus bersifat dinamis dan tumbuh seiring dengan pertumbuhan basis pengguna.

Yang saya tahu hanyalah bahwa kode tersebut tidak berjalan dalam konteks/urutan yang saya kira. Saya telah mencoba berbagai hal berbeda hanya untuk melihat apa yang akan terjadi seperti memindahkan routes.js ke /lib (dari /client), memindahkan definisi fungsi ke file lain, dan banyak lagi!

Bagaimana cara memperbaikinya? Saya cukup baru di Meteor, jadi sangat mungkin saya membuat kesalahan besar lainnya dan kesulitan yang saya alami ini hanyalah gejalanya. Jika ya, beri tahu saya!

/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 sumber


Jawaban (1)


Lihat Dokumen Meteor (gulir sedikit ke bawah ke "Urutan pemuatan file") . /lib/at_config.js dimuat sebelum /lib/functions.js, jadi getSupervisors belum ditentukan pada saat itu.

Tidak yakin bagaimana struktur kode Anda secara umum, jadi saya tidak bisa memberikan petunjuk apa pun tentang bagaimana saya akan melakukan ini. Dokumentasi adalah teman Anda di sini.

person Oskar    schedule 25.07.2015
comment
Ini adalah kesalahan bodoh di pihak saya. Saya meninggalkan angka 1 pada nama file. File tersebut sebenarnya bernama 1functions.js karena masalah urutan pemuatan ini. - person giraffeslacks; 26.07.2015
comment
Apakah merupakan ide buruk untuk memasukkan keluaran fungsi ke dalam variabel sesi ketika isServer dan kemudian mengambilnya di isClient? ...Oke, itu tidak berhasil karena ini hanya untuk klien. - person giraffeslacks; 26.07.2015