【问题标题】:Template is re-rendered even though there is no data change即使没有数据更改,模板也会重新呈现
【发布时间】:2013-08-30 12:13:04
【问题描述】:

我正在努力解决一个问题,我将通过一个简单的演示来解释。

People 收藏中有以下非常简单的文档。

{  
    "_id" : "vxmLRndHgNocZouJg",  
    "fname" : "John" ,  
    "nicks" : [ "Johnny" , "Jo"]  
}

现在让我们考虑以下模板。基本上我会显示用户名和带有输入字段的昵称列表,以添加更多昵称。

<head>
  <title>test</title>
</head>
<body>
  {{> name}}<br/>
  {{> nicks}}
</body>

<template name="name">
    <input type="text" value="{{fname}}"/>
</template>

<template name="nicks">
    {{#each nicks}}
        <div>{{this}}</div>
    {{else}}
        no nicks yet
    {{/each}}
    <input type="text" name="nicks"/>
    <input type="submit"/>
</template>

我的客户端javascript代码如下:

Template.name.fname = function() {
    return People.findOne({"fname" : "John"},{
        transform : function(doc) {
            return doc.fname;
        }
    });
}

Template.name.rendered = function() {
  console.log('Template "name" rendered!');
}

Template.nicks.nicks = function() {
  var john = People.findOne({"fname" : "John"});
  if(john) return john.nicks;
}
Template.nicks.events({
'click input[type="submit"]' : function () {
  var johnId = People.findOne({"fname" : "John"})._id; // demo code
  People.update(johnId,{
      $addToSet : {
          nicks : $('input[name="nicks"]').val()
      }
  })
}
});

我的问题是在添加昵称(更新文档中的nicks 字段)模板name 后重新渲染(我知道是因为我控制台记录它)。当我查询People 集合以提供name 模板的数据时,我使用transform 选项,因此nicks 字段中的更改不应影响name 模板。

Meteor 文档支持这一点:

游标是一种反应式数据源。第一次在响应式计算(例如,模板或自动运行)中使用 fetch、map 或 forEach 检索游标的文档时,Meteor 将注册对基础数据的依赖关系。任何更改游标中文档的集合都会触发重新计算。

为什么模板name会被重新渲染呢?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    模板被重新渲染,因为您更改了 People 集合。

    当您更改 People 集合时,Meteor 会自动假定它提供数据的所有内容都需要重新计算。 (您的 name 模板通过 Template.name.fname 执行。

    即使您转换了光标的输出,People 集合也发生了某种变化。查询是在使用转换之前完成的,换句话说,它不是查看的转换,而是整个集合。

    Meteor 认为您的带有{'fname':'John'} 的文档可能有一些其他字段可能已更改,它需要重新查询以检查(nicks 字段已更改)。然后在重新查询后应用转换。

    此时您的 HTML 可能实际上并没有改变,只有当光标返回不同的内容时,html 才会改变。

    如果它在任何情况下都成为问题(即在不应该的情况下清除表单或更改 DOM),您可以使用{{#isolate}} {{/isolate}} 块来确保只有它们内部的所有内容都被重新渲染,而外部没有任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多