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