在Meteor中等待模板渲染,不一致

时间:2015-03-11 22:16:44

标签: templates meteor

一直在摸不着头脑,所以这是查看它的最简单方法 - 我用这个:

Template.today.rendered = function() {
    console.log(this.firstNode.children.length);
};

只需尝试获取所谓的呈现的项目数。模板看起来像:

<template name="today">
    <div class="todaySlider">
        {{#each dayOfWeek}}
            {{> singleDay}}
        {{/each}}
    </div>
</template>

如果它有任何重要性,则singleDay如下:

<template name="singleDay">
    <div class="day {{isCurrent}}">
        <h2 class="date">{{date}}</h2>

        {{#each items}}
            {{> item }}
        {{/each}}
    </div>
</template>

我试图等待所有&#34;单日&#34;为了渲染,不过我计算的日志记录在刷新时通常是不同的。我会得到0到正确值的任何东西,我不明白为什么。这似乎是一个称之为正确的地方,我担心这可能是双重的&#34;每个&#34;太慢了?

我已经尝试过定时器(我真的不应该这样),甚至是DOM Mutation Observers(看起来有点矫枉过正)但是肯定有一种纯粹的Meteor方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

Template.rendered在渲染模板时发生,但这并不意味着其中会有任何数据。

我很确定你需要在帮手里面做这件事。

每个助手都不必返回游标,他们也可以返回一个数组。如果“singleDays”的数量很短,您可以将数组发送到模板而不是光标。这有点难看,可能有更好的方法来做到这一点,但我认为这样可行。

Template.today.helpers({
    dayOfWeek: function() {
        var days = DaysCollection.find({}).fetch();
        if (days[days.length - 1]) days[days.length - 1].isLast = true;
        return days;
    }
});

我认为{{isCurrent}}是你添加你正在谈论的额外课程的地方。如果是这样,请让isCurrent帮助器查找this.isLast为真。

答案 1 :(得分:1)

似乎这里发生的事情是在将Mongo集合发送到客户端之前呈现模板。更具体地说,流星尽可能快地渲染你的模板,这意味着它没有等待&#39;等等的概念。用于从服务器发送到客户端的任何数据。因此,如果您在非响应调用(Template.rendered)内部间接放置有关数据库查询的任何内容,则它将使用undefined数据执行。

我假设您的dayOfWeek助手看起来像这样:

Template.today.helpers({
  daysOfWeek: function () {
    var today = CollectionName.findOne();

    return today.daysOfWeek;
  }
})

(或者您可能正在使用路由器将这一天直接传递给模板)

无论哪种方式,在路由器中,您需要等待Mongo集合项在发生任何渲染之前发送到客户端。如果您使用的是Iron-Router,则只需等待&#39;为您的数据/订阅。

可在此处找到更多信息:https://github.com/iron-meteor/iron-router/blob/devel/Guide.md#wait-and-ready

如果您仍在使用自动发布,则可以使用数据库查询替换订阅。