Meteorjs数据数组未在第一个模板渲染时呈现

时间:2016-09-29 15:27:37

标签: javascript meteor meteor-blaze

我正在Meteorjs的一个项目上工作,但我在渲染一些数据时遇到了问题。

问题是:在第一个模板渲染时,没有html。然后我将模板切换到' MAP'查看并返回我的列表'查看,现在有不同培训师的HTML。

我有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中确切地拥有了我需要的东西。

接下来,我尝试使用

的基本方法将训练者渲染到我的template
{{#each trainer in trainers}}
     Do some stuff in html yeah !
{{/each}}

我确定并可以使用Blaze的{{>TemplateDynamic }}空格键切换视图。

1 个答案:

答案 0 :(得分:0)

根据您的功能定义位置,您可以使用ReactiveVar并将其设置为data功能中的数据,,而不是返回{{1} },将对象设置为ReactiveVar:

data

最后,使用帮助程序检索数据:

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);
});

这样,如果您的模板在之前呈现,则会检索数据,一旦在您的函数中设置了myData,它就会被更新并重新呈现。