#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 в вашей функции.