此Meteor代码需要根据headerLabel
更改Session.get('headerLabel')
的值,当在不同的客户端文件中设置时,它不会更新模板显示。
为什么以及如何解决?感谢
// client/header.js
Template.header.helpers({
headerLabel: function () {
let userId = Meteor.userId();
if (!userId) {
Session.set('headerLabel', 'Please login');
} else {
Meteor.subscribe('headerLabel');
let label = HeaderLabelCol.findOne({userId: userId}).headerLabel;
Session.set('headerLabel', label);
}
return {headerLabel: Session.get('headerLabel')};
}
});
// client/lib.js
utility = (function () {
return {
toast: function (headerMsg) {
const temp = Session.get('headerLabel');
Session.set('headerLabel', headerMsg);
setTimeout(() => {Session.set('headerLabel', temp)}, 2000);
}
}
}());
<template name="header">
<header>
<h1 class="main-menu">
<button class="mainMenu" type="button">☰</button>
</h1>
<h3>
<label class="header-label">
{{headerLabel.headerLabel}}
</label>
</h3>
<h1>
<button class="subMenu" type="button">⋮</button>
</h1>
</header>
</template>
这可以从客户端的其他文件中调用
utility.toast('Wrong entries');
答案 0 :(得分:0)
Helper函数应该只获取模板所需的数据,它们永远不应该操纵应用程序的状态。特别是,每次重新呈现模板时,您调用的Meteor.subscribe
都会创建一个新的订阅句柄。这是一个严重的泄漏。
相反,您应该将逻辑代码移至onCreated
,onRendered
和onDestroyed
方法。
Template.header.onCreated(function() {
this.subscribe('headerLabel');
this.autorun(function() {
let userId = Meteor.userId();
if (userId) {
let label = HeaderLabelCol.findOne({userId: userId}).headerLabel;
Session.set('headerLabel', label);
} else {
Session.set('headerLabel', 'Please login');
}
});
});
Template.header.helpers({
headerLabel: function () {
return Session.get('headerLabel');
},
});