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

时间:2015-05-22 05:36:36

标签: meteor meteor-blaze meteor-helper

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

但如果我直接在Chrome的地址栏中打开http://localhost:3000/test(Input网址并按Enter键,则不会显示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文档,帮助程序是一种被动计算,而对集合的数据库查询是被动数据源。因此,在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()是被动的?但为什么我的角色标签仍然是空白的?

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

使用 Template.subscriptionsReady

服务器/ publish.js

container.insertBefore(newElement, container.firstChild);

的客户机/ client.js

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

的客户机/ templates.html

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

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

在所有订阅

时返回true的反应函数

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