当Blaze重用模板时,如何触发Template#onRendered?

时间:2016-11-02 16:00:00

标签: jquery-ui meteor meteor-blaze

当Blaze重用模板时,如何触发Template#onRendered或等效模板?

我有一个基于<select>元素的jQuery UI selectmenu小部件,其<option>个子元素是使用{{#each}}创建的(针对一个帮助器,它使用Session来获取反应性)和Blaze模板。我正在刷新选择菜单onRendered。

  • Blaze模板是正确的。 (<option>{{text}}</option>
  • 会话正在变更(使用console.log()检查并在浏览器控制台中手动设置。
  • 会话反应,帮助和{{#each}}正在运行(检查隐藏的<select>表明其选项已正确更新)

只是模板正在被重用,所以尽管一切都正常,只要Session选项上下文发生变化就有更多选项(onRendered()在新模板实例之后被调用如果Session选项上下文更改为具有相同或更少的选项(更少的选项仅调用onDestroyed(),则jQuery UI selectmenu不准确(不与上下文的当前状态保持同步)相同数量的选项甚至不能做到这一点。

1 个答案:

答案 0 :(得分:0)

解决方案:帮助器内部使用Tracker.afterFlush(callback)(每次我预期会调用 )而不是Tempate.on_ [anything] _()。

https://docs.meteor.com/api/tracker.html#Tracker-afterFlush

e.g。

myContextOptionsHelper: function () {
  let context = Session.get('myContext');
  let contextOptions = app.client.tempdata.contextOptions[context];
  Tracker.afterFlush(() => {
    if ($('#mySelectmenu').is(':ui-selectmenu')) {
      $('#mySelectmenu').selectmenu('refresh');
    }
  });
  return contextOptions;
}