0

我想在会话变量更改时重新渲染块助手。

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

助手实际上已执行,但视图未更新。理想情况下,只有助手渲染的部分会被重新渲染(Template.myTemplate)。但是重新渲染整个页面也是一种选择。

我怎样才能做到这一点?

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

咖啡脚本:

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>

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

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

4

2 回答 2

1

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

Template.myTemplate.extend({
  render: function () {
    // do something with your session here ...
    return Template.myTemplate.render.apply(this, arguments);
  }
});
于 2014-07-18T14:25:50.007 回答
0

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

在你的 blockhelper 中做:

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中描述的一种可能性。在我的示例中,我需要块助手在任何地方工作,而不知道我将在哪些模板中实际使用它。

于 2014-11-14T09:49:33.810 回答