如果我先打开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()
是被动的?但为什么我的角色标签仍然是空白的?
有人可以解释一下吗?
答案 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的反应函数