【发布时间】: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