在session.set之后模板助手不更新

时间:2016-04-15 13:02:55

标签: javascript meteor

此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">&#9776;</button>
    </h1>
    <h3>
      <label class="header-label">
        {{headerLabel.headerLabel}}
      </label>
    </h3>
    <h1>
      <button class="subMenu" type="button">&#8942;</button>
    </h1>
  </header>
</template>

这可以从客户端的其他文件中调用 utility.toast('Wrong entries');

1 个答案:

答案 0 :(得分:0)

Helper函数应该只获取模板所需的数据,它们永远不应该操纵应用程序的状态。特别是,每次重新呈现模板时,您调用的Meteor.subscribe都会创建一个新的订阅句柄。这是一个严重的泄漏。

相反,您应该将逻辑代码移至onCreatedonRenderedonDestroyed方法。

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');
  },
});