【问题标题】:Meteor: Elements from CollectionA re-rendering when I insert to CollectionBMeteor:当我插入 Collection 时,来自 Collection 的元素重新渲染
【发布时间】:2013-02-11 06:54:36
【问题描述】:

我正在尝试在用户发布的 cmets 的响应式 {{#each}} 中淡入新元素。

我在https://gist.github.com/3119147 有一个非常简单的 cmets 部分的代码示例(不包括 textarea 和新的注释插入代码,但它非常样板。)。包括一个 CSS 的 sn-p,我在其中提供 .comment.fresh { opacity: 0; },然后在我的脚本中,我有:

Template.individual_comment.postedago_str = function() {
  var id = this._id;
  Meteor.defer(function() {
    $('#commentid_'+id+'.fresh').animate({'opacity':'1'}, function() {
      $(this).removeClass('fresh');
    });
  });
  return new Date(this.time).toString();
};

这似乎是一个执行动画的糟糕地方。我的想法是,每次呈现新评论时,它都需要调用我所有的 Template.individual_comment.* 函数,这就是为什么我的动画会延迟其中一个。但是,每次插入 不同 集合(喜欢)时,Meteor 都会调用 Template.individual_comment.postedago_str()。这意味着我单击 Like 按钮,我的整个 cmets 列表会闪烁白色并淡入(非常烦人!)。

我阅读了 Meteor 文档并试图弄清楚如何更好地分割我的模板以便只有块会更新,并且我在所有看起来合理的地方添加了 id="" 属性.. 仍然是这个错误。有谁知道怎么回事?

TIA!

【问题讨论】:

  • 嗨,迈克,您能否进一步简化您的要点,以便仅包含问题中涉及的核心元素?这会有所帮助。
  • @TomColeman:但是您需要其他行才能重现问题,对吧?也许他可以用最少的代码在线设置一个调试版本(我们可以在调试模式下进行检查)。
  • 嗯,该模板中有很多元素可能会产生影响。简化为表现出相同行为的最简单示例会更容易推理。
  • 我将在今天晚些时候整理一个准系统演示,Tom。但是实际上并没有太多......两个集合,一点HTML,以及JS中的一些模板助手。只是试图证明 Template.interaction 的东西似乎与 Template.individual_comment 的东西混淆了。

标签: dom callback rendering jquery-animate meteor


【解决方案1】:

作为一种解决方法,您可以将 {{if}} 块包裹在各个 cmets 上的 fresh 类周围,这将检查评论的创建时间,并且如果评论实际上是最近的,则仅首先添加 fresh 类.比如:

<div class="comment{{#if isActuallyFresh}} fresh{{/if}}" id="commentid_{{_id}}">

然后定义isActuallyFresh函数:

Template.individual_comment.isActuallyFresh = function() {
  if ((new Date().getTime() - this.time) < 300000) // less than 5 minutes old
     return true;
  else
     return false;

【讨论】:

  • 对不起,我从未见过这个答案!这是一个好主意,可能会奏效,但我退出了我正在从事的项目。下次我一定会尝试这种方法!
猜你喜欢
  • 2017-09-22
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多