Meteor在特定字段更改时不重新渲染

5
Meteor会在文档发生变化时重新渲染视图。
Template.story.data = function() {
  var storyID = Session.get('storyID');
  var story = Stories.findOne({
    _id: storyID
  })

  if (!story)
    return;

  return story;
};

这是一个针对故事模板的模板助手,可以从故事文档中获取故事。
当像story.title这样的字段发生更改时,我希望模板重新呈现。但是,当像story.viewingusers这样的字段发生更改时,我不希望重新呈现模板。有没有办法实现这一点?
触发问题的具体解决方法是将发布功能设置为不发布那些字段。然而,这种解决方法并不适用于每种用例,需要一个通用的解决方案。

这仍然是正确的数据,对吗?除了优化之外,您不想让模板多次渲染的原因是什么? - Tom Coleman
@TomColeman 数据是正确的,但我有一个界面元素显示为弹出窗口。每次重新渲染元素时,弹出窗口都会被销毁。这真的很烦人。 - Harry
1个回答

3
你需要找的是#constant模板助手。
在你的情况下,我会将弹出框标记包装在一个常量块中,然后在story.rendered函数中手动更新该块中的内容。
所以大致如下:
story.html:
<template name="story">
    ...
    {{#constant}}
        <!-- Popover markup here -->
    {{/constant}}
    ...
</template>

client.js:

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

这是一个选项,但它会破坏 Meteor 的逻辑风格并增加很多复杂性,因此我希望有更直接解决问题的方法。 - Harry
嗯,我不太确定Meteor风格的逻辑,但我从Meteor的“parties”示例中学到了这种技巧。你应该浏览一下那个示例,它在逻辑周围包装了一个autorun,因此更新逻辑也被“以Meteor的方式”无效化了。 - Clark Pan
这迫使你使用 Meteor.render 或通过 DOM 操作构建 HTML,两者都不是很好。我查看了 parties 的示例,他们是这样做的。 这可以运行,但会使渲染变慢,将模板代码放入 javascript 而非模板中,并迫使您将模板分成更多部分。所有这三点都增加了复杂度,使事情难以维护。但就 Stack Overflow 而言,这是一个出色且有用的答案,谢谢。 - Harry
我不同意有关缓慢渲染的看法,但是是的,这会打破视图代码中的逻辑分离。我真的认为除非Meteor内置一种处理这种特定用例的标准方法,否则没有办法避免这种情况。 - Clark Pan
{{#constant}} 已被弃用,从表面上看似乎不再存在。 - Jean-François Beauchamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接