2017-02-21 40 views
0

У меня есть вспомогательная функция, которая возвращает массив вместо обычного курсора db.dbName.find(). Как мне закодировать код return array, чтобы он отражался как указатель, похожий на один, сгенерированный db.dbName.find(), который я могу использовать в шаблоне?Как вернуть массив/значение в качестве курсора, который можно использовать в моем шаблоне?

Найти ниже моей вспомогательной функции:

var arrayTest = Meteor.call('getUserCategoryArray', function(error, results){ 
    if(error){ 
     console.log(error.reason); 
    } else {   

    var results1 = results.toString(); 
    var results2 = results1.split(","); 
    alert("Array content: " +results2); 
    alert(results2[0]); 
    alert(results2[1]); 
    alert(results2[2]); 

    return results2; 

    } 
}) 

Чтобы объяснить часть кода: Сверху вниз: Оповещения успешно печатает:

Array content: shoes,clothes,watches 

shoes 

clothes 

watches 

Предупреждение только для подтверждения того, что results2 является рабочим массивом. Теперь, как мне закодировать возвращаемое значение/массив, чтобы я мог использовать его в своем шаблоне, как если бы он был курсором, возвращаемым запросом db.dbName.find()?

Ваша помощь приветствуется.

+0

Вы можете передать массив на #each handlebar. Оформить заказ [пример здесь] (http://stackoverflow.com/questions/21234947/meteor-handlebars-how-to-access-a-plain-array) – mutdmour

+0

@mutdmour Спасибо, но я не понимаю, как применить его к мой код. Я попробовал это в своем шаблоне: '{{#each results2}} \t {{this}} {{each}}', который, похоже, не работал. Я также попробовал имя вспомогательной функции, которое: allCategorie, поэтому в шаблоне я попробовал '{{#each allCategories}} \t {{this}} {{each}}'. все еще не работал. Любая помощь приветствуется – SirBT

ответ

1

Ваша проблема не в массивах, а о синхронном и асинхронном программировании. как упоминалось в @mutdmour, пробелы могут обрабатывать массив из помощника просто отлично.

Помощники могут быть вызваны несколько раз при визуализации шаблона, поэтому он не должен делать ничего асинхронного или иметь какие-либо побочные эффекты. ваш помощник делает асинхронный вызов, так что это одна проблема с места в карьер.

Проблема, которую вы видите, заключается в том, что такой вызов является асинхронным, а помощник должен быть синхронизирован. поэтому у вас возникнут проблемы с тем, чтобы ваш помощник работал как есть.

Во многих случаях помощники возвращают содержимое или указатель на содержимое коллекции. Я не знаю вашего приложения, но является ли публикация/подписка с содержимым коллекции лучшим выбором здесь?

если нет, и он должен быть результатом вызова метода, то вообще я буду:

  1. сделать вызов в onCreated()
  2. запись результатов в реакционно-вар
  3. вернуть реактивные переменные из вспомогательного оборудования

eg

Template.Foo.onCreated(function() { 
    let self = this; 
    self.clothing = new ReactiveVar(); 

    Meteor.call('getUserCategoryArray', function(error, results) { 
     if (!error) { 
      // or whatever you need to do to get the results into an array 
      self.clothing.set(results); 
     } 
    }); 
}); 

Template.Foo.helpers({ 
    clothing() { 
     return Template.instance().clothing.get(); 
    } 
});