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

Waiting for template render in Meteor, inconsistent

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

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>

我正在尝试等待所有 "singleDays" 呈现,但是我记录的计数在刷新时通常是不同的。我会得到从 0 到正确值的任何值,但我不明白为什么。这似乎是调用它的正确位置,我担心 double "each" 可能太慢了?

我已经尝试过定时器(老实说我不应该这样做)甚至 DOM 变异观察者(这看起来有点过分)但是肯定有一个纯粹的 Meteor 方法来解决这个问题,有什么想法吗?

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

我很确定您需要在助手中执行此操作。

每个助手不必 return 游标,他们也可以 return 数组。如果 "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}} 是您添加您正在谈论的额外 class 的地方。如果是这样,只需让 isCurrent 助手查找 this.isLast 为真。

似乎这里发生的是在将 Mongo 集合发送到客户端之前呈现模板。更具体地说,meteor 以尽可能快的速度呈现您的模板,这意味着它对于从服务器发送到客户端的任何数据没有 'waiting' 的概念。因此,如果您在非反应性调用 (Template.rendered) 中放置任何与数据库查询相关的间接内容,那么它将以 undefined.

形式执行数据。

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

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

    return today.daysOfWeek;
  }
})

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

无论哪种方式,在您的路由器中您需要等待 Mongo 集合项在任何渲染发生之前被发送到客户端。如果您使用 Iron-Router,您只需 'wait' 为您的 data/subscription。

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

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