如何通过使助手反应来重新渲染助手?

时间:2014-07-16 20:20:52

标签: meteor spacebars

我希望在会话变量发生变化时重新发送阻截器。

UI.registerHelper "myHelper", () ->
  this.changedSession = Session.get 'someSessionVariable'
  return Template.myTemplate

实际执行了帮助程序,但视图未更新。理想情况下,只有帮助器呈现的部分才会被重新呈现(Template.myTemplate)。但重新阅读整个页面也是一种选择。

我该怎么做?

一个非常简单的应用程序,说明了我的问题:

CoffeeScript:

if Meteor.isClient
  Template.hello.greeting = () ->
    Session.get "greeting"

UI.registerHelper "myHelper", (options) ->
  this['greeting'] = Session.get 'greeting'
  return Template.test

HTML:

<template name="hello">
  {{greeting}}
  {{#myHelper test="test" more="more"}}

  {{/myHelper}}
</template>

<template name="test">
    {{this.greeting}}
</template>

如果我更改了会话变量。问候语本身已更新,包含问候语的模板未更新。

我知道这不是在帮助程序中获取会话的流行方式,但我将其用于原型框架,并且可以在任何模板中使用此帮助程序,而无需为帮助程序定义数据上下文。

2 个答案:

答案 0 :(得分:1)

这似乎是正确的行为。视图不会更新,除非它取决于会话变量本身。有一种方法可以解决这个问题。而不是返回Template.myTemplate尝试返回此:

Template.myTemplate.extend({
  render: function () {
    // do something with your session here ...
    return Template.myTemplate.render.apply(this, arguments);
  }
});

答案 1 :(得分:0)

对于Meteor 1.0,您可以执行以下操作:

在你的阻截者中:

UI.registerHelper "myHelper", (options) ->
  new Template Template.myTemplate.viewName, ->
    Session.get 'something' #do something reactive...
    return Template.myTemplate.renderFunction.apply this, arguments

如果你确实知道在哪个模板中使用了帮助器,那么最好使用https://stackoverflow.com/a/23450884/2037537中描述的一种可能性。在我的例子中,我需要块帮助器才能在任何地方工作而不知道我实际使用它的模板。