等待 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
如果您仍在使用自动发布,则可以将订阅替换为您的数据库查询。
我一直在摸不着头脑,所以这是最简单的查看方式 - 我正在使用这个:
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
如果您仍在使用自动发布,则可以将订阅替换为您的数据库查询。