我正在使用Meteor并遇到一个问题,即在我不想要的时候重新呈现我的内容。
我的主要内容包含在currentUser
if语句中,我觉得这是相当标准的。
{{#if currentUser}}
{{> content}}
{{/if}}
这个问题是我更新用户对象时正在重新呈现我的内容模板。有没有办法解决?我不会在内容模板中的任何位置引用用户。
谢谢!
这是一个用于复制我的问题的示例应用:
HTML
<head>
<title>Render Test</title>
</head>
<body>
{{loginButtons}}
{{> userUpdate}}
{{#if currentUser}}
{{> content}}
{{/if}}
</body>
<template name="userUpdate">
<p>
<input id="updateUser" type="button" value="Update User Value" />
User last update: <span id="lastUpdated">{{lastUpdated}}</span>
</p>
</template>
<template name="content">
<p>Render count: <span id="renderCount"></span></p>
</template>
的JavaScript
if (Meteor.isClient) {
Meteor.startup(function() {
Session.set("contentRenderedCount", 0);
});
Template.content.rendered = function() {
var renderCount = Session.get("contentRenderedCount") + 1;
Session.set("contentRenderedCount", renderCount);
document.getElementById("renderCount").innerText = renderCount;
};
Template.userUpdate.events = {
"click #updateUser": function() {
Meteor.users.update({_id: Meteor.userId()}, {$set: {lastActive: new Date()}});
}
};
Template.userUpdate.lastUpdated = function() {
return Meteor.user().lastActive;
};
}
if (Meteor.isServer) {
Meteor.users.allow({
'update': function () {
return true;
}
});
}
更新
我应该稍微解释一下这个例子。创建用户后,单击“更新用户值”按钮会使渲染计数增加。这是因为它包含在{{#if currentUser}}
中。如果删除了if,您会注意到渲染计数保持为1。
此外,您还需要将accounts-ui
和accounts-password
个包添加到您的项目中。
答案 0 :(得分:8)
Meteor将重新渲染包含已更改的反应变量的任何模板。在您的情况下,{{currentUser}}
是Meteor.user()
,它是包含用户数据的对象。当您更新用户配置文件时,对象会发生变化,并告诉meteor重新计算涉及该对象的所有反应。
我们可以稍微改变一下反应,这样它只会对用户是否登录/退出而不是对象本身内的任何内容的变化作出反应:
Meteor.autorun(function() {
Session.set("meteor_loggedin",!!Meteor.user());
});
Handlebars.registerHelper('session',function(input){
return Session.get(input);
});
你的HTML
{{#if session "meteor_loggedin"}}
{{> content}}
{{/if}}