【问题标题】:Meteor to not rerender when certain fields change某些字段更改时流星不会重新渲染
【发布时间】:2012-11-14 00:40:44
【问题描述】:

Meteor 在文档更改时重新呈现视图。

Template.story.data = function() {
  var storyID = Session.get('storyID');
  var story = Stories.findOne({
    _id: storyID
  })

  if (!story)
    return;

  return story;
};

这是故事模板的模板助手,用于从 Stories 文档中获取故事。

story.title 等字段发生更改时,我希望模板重新呈现。但是当story.viewingusers 之类的字段发生变化时,我不想重新渲染模板。无论如何要做到这一点?

触发问题的具体问题已通过将发布功能设置为不发布这些字段来解决。然而,该解决方案并不适用于所有用例,需要一个通用的解决方案。

【问题讨论】:

  • 数据还是正确的吧?您是否有理由不希望模板多次渲染(超出优化范围?)
  • @TomColeman 数据是正确的,但我有一个显示为弹出框的界面元素。每次重新渲染元素时,弹出框都会被销毁。这真的很烦人。

标签: javascript meteor


【解决方案1】:

您正在寻找的是 #constant 模板助手。

在您的情况下,我要做的是将弹出框标记包装在一个常量块中,然后在 story.rendered 函数中手动更新该块中的内容。

所以是这样的:

故事.html:

<template name="story">
    ...
    {{#constant}}
        <!-- Popover markup here -->
    {{/constant}}
    ...
</template>

client.js:

Template.story.rendered = function(){
    //Update logic here
}

【讨论】:

  • 这是一个选项,但是它破坏了流星风格的逻辑并增加了很多复杂性,所以我希望能更直接地解决这个问题。
  • 嗯,我不确定流星风格的逻辑,但我从流星中的“派对”示例中学到了这种技术。你应该看一下那个例子,它围绕逻辑包装了一个自动运行,因此更新逻辑在“流星风格”中也是无效的。
  • 这迫使您使用Meteor.render 或使用dom 操作构建您的HTML。两者都不是很好。我检查了当事人的例子,这就是他们所做的。这行得通。但它会使渲染速度变慢,将模板代码放入 javascript 而不是模板中,并迫使您将模板分解为更多部分。所有这三件事都增加了复杂性并使事情难以维护。但我的意思是,就 SO 而言,这是一个很好且有用的答案,谢谢。
  • 我不同意缓慢的渲染,但是它会破坏视图代码中的逻辑分离。我真的不认为有办法避免这种情况,除非 Meteor 内置了一个标准方法来处理这个特定的用例。
  • {{#constant}} 已被弃用,看起来不再存在。
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2018-11-29
  • 2017-11-16
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多