Метеор: данные из внешнего вызова API не отображаются

Я относительно новичок в Метеоре, и я пытаюсь создать интернет-магазин для моей золовки, который берет данные из ее существующего магазина Etsy и создает для него индивидуальный скин. Я определил все свои Meteor.methods для извлечения данных, и я проверил данные с помощью ряда операторов console.log... Итак, данные есть, но они не отображаются на экране. Вот пример некоторого кода на стороне сервера:

Meteor.methods({

  ...

    'getShopSections': function() {
      this.unblock();
      var URL = baseURL + "/sections?api_key="+apiKey;
      var response = Meteor.http.get(URL).data.results;
      return response;
    }

  ...

});

Этот метод возвращает массив Object. Примерный бит строки JSON из одного из возвращенных объектов из массива:

{
  active_listing_count: 20,
  rank: 2,
  shop_section_id: 1******0,
  title: "Example Title",
  user_id: 2******7
}

Получив эти данные без помех, я был готов сделать звонок со стороны клиента, и я попытался и потерпел неудачу несколькими различными способами, прежде чем поиск Google нашел меня в этом руководстве здесь: https://dzone.com/articles/ интегрирующий-внешний-АПИС-ваш

На стороне клиента у меня есть файл nav.js со следующим фрагментом кода, адаптированным из приведенного выше руководства:

Template.nav.rendered = function() {
    Meteor.call('getShopSections', function(err, res) {
      Session.set('sections', res);
      return res;
    });
};
Template.nav.helpers({
    category: function() {
      var sections = Session.get('sections');
      return sections;
    }
});

И пример вызова из моего шаблона nav.html...

<ul>
  {{#each category}}
    <li>{{category.title}}</li>
  {{/each}}
</ul>

Итак, здесь происходит несколько вещей, в которых я не уверен. Прежде всего, DOM не рендерит ни одну из строк category.title, несмотря на отображение соответствующего числа li заполнители. Во-вторых, прежде чем я следовал вышеописанному руководству, я не определил переменную Session. Учитывая, что список категорий магазинов должен оставаться статичным после загрузки шаблона, я не думал, что это было необходимо из того, что я понимаю о переменных сеанса... но по какой-то причине это было различием между шаблоном, отображающим один пустой <li> тег против числа пустых <li>Это равно category.length --- так что, хотя я не могу понять, зачем нужна переменная Session в этом случае, она приблизила меня на один шаг ближе к моей цели... Я попробовал несколько консолей.log заявления на стороне клиента, и я на 100% уверен, что данные определены и доступны, но когда я проверяю исходный код в моем окне Developer Tools, DOM просто показывает количество пустых li скобки.

Может ли какой-нибудь Метеор-гуру объяснить, почему 1) DOM не отображает какие-либо заголовки и 2) действительно ли необходима переменная Session? Пожалуйста, дайте мне знать, если потребуется дополнительная информация, и я буду очень рад ее предоставить. Спасибо!

1 ответ

Решение

Вы устанавливаете контекст данных, когда используете #each, поэтому просто используйте:

<li>{{title}}</li>

Если сессия является подходящим типом реактивной переменной для использования здесь или нет, трудно определить, не зная, что вы делаете, но я предполагаю, что коллекция Mini Mongo может лучше подходить для того, что вы делаете.

Для начала вы решите, какой правильный тип реактивной переменной использовать для этого, перейдите к полной документации Метеора и исследуйте: коллекции, сеансы и реактивные переменные.

Редактировать: Чтобы сделать шаг назад и пояснить немного, помощник по шаблону называется реактивным вычислением. Реактивные вычисления внутри помощников будут выполняться только в том случае, если они используются в их соответствующих шаблонах И если вы используете реактивную переменную внутри вычисления. Существует несколько типов реактивных переменных, каждый со своими атрибутами. Вероятно, ваш код вообще не работал до того, как вы использовали Session, потому что вы не использовали реактивную переменную.

Другие вопросы по тегам