Массив данных Meteorjs не отображается при первом отображении шаблона

#javascript #meteor #meteor-blaze

#javascript #метеор #meteor-blaze

Вопрос:

Я работаю над проектом в Meteorjs, но у меня проблема с отображением некоторых данных.

Проблема в том, что при первом отображении шаблона html отсутствует. Затем я переключаю шаблон на представление «КАРТА» и возвращаюсь к своему представлению «СПИСОК», и теперь есть html с разными трейнерами.

У меня есть a routeController , который выполняет некоторые дополнительные операции, чтобы получить некоторые data из Algolia них, и помещает их в data.trainers массив.

Например (в trainers_controller.js ):

 data: function() {
    var trainers_tab = [];
    // algolia
    var client = algoliasearch('XXXXXXXXX', 'XXXXXXXXXX');
    var index = client.initIndex('myindex');

    if(Meteor.user()) {
        tab = Trainers.find({});

        tab.forEach(function(trainer) {
            index.getObject(trainer.doctor_id, function (err, content) {
                if (err) {
                    console.error(err);
                    return;
                }

                // geoloc address
                // TODO : retrieve training exact address

                // push to array
                trainers_tab.push({
                    objectID: content.objectID,
                    name: content.name,
                    city: content.city,
                    speciality: content.speciality,
                    photo: content.photo,
                    about: content.about,
                    email: content.email,
                    phone: content.phone
                    //address:
                });
            });
        });

    }


    var data = {
        params: this.params || {},
        trainers: trainers_tab
    };
return data;
}
  

У меня есть именно то, что мне нужно в data.trainers .

Затем я пытаюсь отобразить трейнеры в my template с помощью базового метода

 {{#each trainer in trainers}}
     Do some stuff in html yeah !
{{/each}}
  

Я определяю и могу переключать представление с {{>TemplateDynamic }} помощью пробела Blaze.

Комментарии:

1. Можете ли вы опубликовать свой полный код? Вы предоставляете data.trainers доступ через помощник шаблона? Если нет, то шаблон не знает, откуда брать эти данные.

2. Привет, maxko87. По некоторым профессиональным причинам я не могу опубликовать весь код. Нет, мои data.trainers не отображаются через помощников шаблона, я пытался это сделать, и это ничего не меняет. Как я уже сказал, при первом отображении на странице не отображаются какие-либо данные. Но при втором отображении здесь есть, и у меня отображаются все мои данные. (И не обращайтесь к нему в помощниках шаблона …). Есть предложения?

3. У меня были помощники шаблона для извлечения моих данных со стороны клиента в шаблон. Та же проблема, при первом отображении данных нет данных, затем переключается шаблон, а после отображаются данные… Предложения?

4. Я бы предположил, что это связано с кэшированием на стороне клиента Algolia, хотя я не углублялся в код, чтобы проверить его поведение. Разумным объяснением является то, что обратный вызов вызывается синхронно, когда данные находятся в локальном кэше, поэтому data.trainers заполняется до data возврата функции. Во время первого рендеринга это не так, и свойство остается пустым массивом во время рендеринга.

5. Я попытался добавить переменную canRender = false и установить для нее значение true, когда все данные были загружены. Если canRender != true, рендеринг шаблона отсутствует. Но все равно не работает..

Ответ №1:

В зависимости от того, где определена ваша функция, вы можете либо использовать a ReactiveVar , либо установить его в качестве данных в своей data функции, т. Е. Вместо возврата data установите для объекта значение ReactiveVar:

 Template.foo.onCreated(function() {
  this.myData = new ReactiveVar(null);
});

Template.foo.onRendered(function() {
  // Run your data function here
  const data = {
    params: this.params || {},
    trainers: trainers_tab
  };
  this.myData.set(data);
});
  

Наконец, извлеките данные с помощью помощника:

 Template.foo.helpers({
  data: function() {
    return Template.instance().myData.get();
  },
});
  

Таким образом, если ваш шаблон отображается до извлечения данных, он будет обновлен и повторно отображен после установки myData в вашей функции.