我正在努力解決一個問題,我將解釋給出一個簡單的演示。即使沒有數據變化,模板也會重新渲染
在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
後(我知道,因爲我安慰.log)。當我查詢People
集合爲name
模板提供數據時,我使用transform
選項,因此nicks
字段中的更改不應該對name
模板產生影響。
流星文檔支持此:
光標是一個反應性數據源。第一次在反應計算(例如模板或自動運行)中檢索具有提取,映射或forEach的遊標文檔時,Meteor將註冊對基礎數據的依賴關係。對光標中的文檔進行更改的集合的任何更改都會觸發重新計算。
爲什麼模板name
被重新渲染呢?