如何强制 Meteor 立即重新渲染,或优先反应更新?

How to force Meteor to rerender immediately, or prioritize reactive update?

我正在尝试构建我自己的加载微调器,我设置它的方式是使用一个助手来检查条目数组是否为空。

{{#if viewThisPage}}
  {{#if noEntriesLoaded}}
    <div class="loadingSpinner">...</div>
  {{/if}}
  {{#each entry}}
    {{ > myTemplate}}
  {{/each}}
{{/if}}

最初 viewThisPage 是错误的。当 viewThisPage 设置为 true 时,我查询 mongoDB 条目。我从基准测试中看到的问题是查询进行得如此之快,以至于所有 DOM 更新事件都被挤压在一起,以至于微调器永远不会被渲染,换句话说,noEntriesLoaded 在很短的时间内为真。

但是,在触发 viewThisPage 和实际呈现页面之间存在大约 1200 毫秒的延迟。我希望在这段滞后期间显示微调器。

我想到了三种方法来解决这个问题

  1. 设置 viewThisPage 后尚未加载条目时,以某种方式强制 meteor 立即重新呈现该部分。
  2. 以某种方式优先考虑对 viewThisPage 的反应性响应,以便它在加载全部内容之前进行更新。
  3. 在添加条目的块上使用 setTimeout() 添加伪延迟。这行得通,我看到了漂亮的加载微调器,但这是有史以来最愚蠢的想法。

您可以在呈现条目时显示微调器。

此代码将仅在呈现所有条目时隐藏 loadingSpinner:

meteor add reactive-var
<template name="Main">
  {{#if viewThisPage}}
    {{#if entriesAreNotReady}}
      <div class="loadingSpinner">...</div>
    {{/if}}
    {{> Entries entry=entry onRendered=onEntriesRendered}}
  {{/if}}
</template>

<template name="Entries">
  {{#each entry}}
    {{> myTemplate}}
  {{/each}}
</template>
Template.Main.onCreated(function() {
  this.areEntriesRendered = new ReactiveVar(false);
});

Template.Main.helpers({
  onEntriesRendered: function() {
    var areEntriesRendered = Template.instance().areEntriesRendered;

    return function() {
      areEntriesRendered.set(true);
    };
  },

  entriesAreNotReady: function() {
    return ! Template.instance().areEntriesRendered.get();
  }
});

Template.Entries.onRendered(function() {
  this.data.onRendered();
});

P.S。在渲染 Entries 模板

之前,您可能需要检查条目是否已加载