【问题标题】:Making meteor rerender "unchanged" fields使流星重新渲染“未更改”的字段
【发布时间】:2015-08-13 22:51:01
【问题描述】:

下面的(简化的)模板呈现了一个带有两个输入字段的表单,这些字段是根据数据上下文预先填写的。可以为多个不同的数据上下文打开表单(尽管一次只能打开一个),在这种情况下,我希望所有字段都使用新数据重新呈现 - 大多数情况下会发生这种情况。

<template name="form">
    <input type="text" value="{{title}}">
    <input type="text" value="{{start_value}}">
</template>

当两个数据上下文的任一字段具有相同的值时,就会出现问题 - 例如start_value 为 0 很常见。这种情况下,数据上下文切换时不会重新渲染相应的输入字段。或许可以举个例子:

  1. 用户使用start_value = 0 打开数据上下文的表单
  2. 用户将start_value对应的输入字段从0更改为12
  3. 用户关闭表单而不保存
  4. 用户使用start_value = 0 打开另一个数据上下文的表单
  5. start_value 对应的字段仍然显示12

这似乎发生在所有(原始)相同的值上。使用帮助程序返回值没有任何改变,但确实确认帮助程序正在按预期重新运行。

我可以在模板实例上使用 autorun-afterflush 来显式更新输入字段来解决此问题,但是是否有更惯用的方法来使 Meteor 重新呈现“未更改”字段?

编辑:

这里是working example(我所说的工作是指它显示了什么不起作用)。

只需在干净的 Meteor 项目的客户端目录中创建这两个文件,您应该能够观察到行为。第 1 项和第 2 项具有保存 value,因此即使您手动更改了第二个输入字段,当您在它们之间切换时也不会更改。第 3 项和第 4 项具有相同的title 并表现出相似的行为。

【问题讨论】:

  • 你能发布你的模板助手和其他js代码吗?我自己没有遇到过这种行为。
  • @FullStack 我在问题中添加了一个完整的示例。

标签: javascript meteor meteor-blaze


【解决方案1】:

我不确定我是否在回答您的问题,但如果您在用户关闭表单后尝试清除某个值,以便在重新打开时不会重新填充该值,那么您可以使用the onDestroyed function

进行您需要的任何清理工作,例如清除似乎是您在打开表单时设置的会话。

【讨论】:

  • These callbacks are called when an occurrence of a template is taken off the page for any reason and not replaced with a re-rendering。不幸的是,表单(在大多数情况下)会立即重新呈现,这意味着不会调用 onDestroyed
  • 啊,对不起,当您说“用户关闭表单”时,我对行为感到有些困惑。表格是如何关闭的?您是否可以捕获关闭它的事件并在那里重置会话?
  • 啊。我没有将它包含在示例中,但表单被放置在一个可以关闭的引导模式中。我可以捕捉到这一点,清除选定的项目,并阻止表单呈现,直到做出新的选择,也许吧?
  • 是的,这就是我要采用的方法。如果模态框具有类似于可以调用的 onClose 函数的功能,则可以在那里重置值。阅读您对会话正在更新而不是输入的响应,您还可以尝试使用 jquery 来确保在呈现时该值是“”(或任何您想要的)。 $('.input-class').val('');
  • 是的,“手动”清除字段是我目前的解决方法,但出于各种原因我想远离它。我想从头开始破坏和渲染模板在我的使用中是可以接受的,所以我现在就这样做。 +1,因为这解决了我的问题,但我会留下这个问题,希望有一个更通用的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2016-06-10
  • 2017-03-14
  • 2014-01-04
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多