为什么我的模板没有反应?

Why does my template not reactive?

如果我先打开http://localhost:3000/,然后点击测试link,就会显示roles标签。

但是如果直接在Chrome的地址栏中打开http://localhost:3000/test(Inputurl回车,roles标签就不会显示了

这是我的代码:

在客户端启动时我订阅了一些东西:

 Meteor.publish("Roles", function(){
   return Roles.find();
 });

 Meteor.startup(function() {
   if(Meteor.isClient) {
     Meteor.subscribe('Roles');
   }
 });

和角色模板:

 Template.roles.helper( {
   allRoles: function() {
     return Roles.find();
   }
 })

html

      <template name="roles">
      <div>
        {{#each allRoles}}
          <label>test label</label>
       {{/each}}
      </div>
    </template>

问题是有时 roles 模板在 Roles 准备好之前呈现。 所以这些是没有显示的角色标签。

但是根据 Meteor 文档,helpers 是一种反应式计算,而 Collections 上的数据库查询是反应式数据源。所以在 Roles 就绪后,{{#with allRoles}} 是反应性的,应该显示。

为什么没有显示角色?

然后我将代码重写为:

 Meteor.startup(function() {
       if(Meteor.isClient) {
        roles_sub = Meteor.subscribe('Roles');
       }
     });

Template.roles.helper( {
       allRoles: function() {
         console.log(2);
         return Roles.find();
       },
       isReady: function() {
         console.log(1);
         console.log(roles_sub.ready());
         return roles_sub.ready();
       }
     })

html

<template name="roles">
  <div>
    {{#if isReady}}
    {{#each allRoles}}
      <label>test label</label>
    {{/each}}
    {{/if}}
  </div>
</template>

仍然无法显示角色标签。 控制台给我:

1
false
1
false
1
true
2

这意味着 isReady() 是被动的?但为什么我的角色标签仍然空白?

有人可以解释一下吗?

使用Template.subscriptionsReady

server/publish.js

 Meteor.publish("Roles", function(){
   return Roles.find();
 });

client/client.js

Meteor.startup(function() {
  Meteor.subscribe('Roles');
});

 Template.roles.helpers({ // --> .helper change to .helpers
   allRoles: function() {
     return Roles.find();
   }
 })

client/templates.html

<template name="roles">
  <div>
    {{# if Template.subscriptionsReady }}
      {{#with allRoles}}
        <label>{{> role }}</label>
      {{/with}}
    {{ else }}
      loading....
    {{/if}}
  </div>
</template>

<template name="role">
  <div>{{ _id }}</div>
</template>

一个反应函数,当所有订阅

时returns为真

https://github.com/meteor/meteor/blob/9fe2f4b442ec84eac5352b476d014c977c5ae4a2/packages/blaze/template.js#L424