【问题标题】:How to rerender a helper by making it reactive?如何通过使其反应来重新渲染助手?
【发布时间】:2014-11-14 17:54:46
【问题描述】:

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

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>

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

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

【问题讨论】:

    标签: meteor spacebars


    【解决方案1】:

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

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

    【讨论】:

    • 这现在不再适用于最新版本的流星(0.8.3),它返回“未定义不是函数”。所以我猜 UI.component 改变了行为
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2021-12-28
      • 2020-12-30
      • 2011-03-20
      • 1970-01-01
      • 2016-07-13
      • 2022-01-04
      相关资源
      最近更新 更多