2013-07-31 29 views
2

有一些反應性我只是不明白,特別是與列表。我的問題可以通過排行榜例子來最容易模仿(meteor --create example leaderboard反應性,隔離性和清單

首先,它添加到客戶端的js(如在http://listtest.meteor.com/完成):

Template.player.rendered = function() { 
    console.log('Player rendered'); 
} 

...然後看控制檯當你運行該應用程序。當你切換選定的科學家時,你會注意到每個玩家都會重新渲染,即使它不需要。

感謝IRC的一些幫助,我發現子模板或#isolating主模板的底部如下(並在http://listtest2.meteor.com/解決了效率低下問題,換句話說,當選擇不同的玩家時,只有兩個玩家現在重新呈現:新選擇和取消

<head> 
    <title>Leaderboard</title> 
</head> 

<body> 
    <div id="outer"> 
    {{> leaderboard}} 
    </div> 
</body> 

<template name="leaderboard"> 
    <div class="leaderboard"> 
    {{#each players}} 
     {{> player}} 
    {{/each}} 
    </div> 
    {{#isolate}} 
    {{#if selected_name}} 
    <div class="details"> 
    <div class="name">{{selected_name}}</div> 
    <input type="button" class="inc" value="Give 5 points" /> 
    </div> 
    {{/if}} 

    {{#unless selected_name}} 
    <div class="none">Click a player to select</div> 
    {{/unless}} 
    {{/isolate}} 
</template> 

<template name="player"> 
    <div class="player {{selected}}"> 
    <span class="name">{{name}}</span> 
    <span class="score">{{score}}</span> 
    </div> 
</template> 

我的問題是:爲什麼隔離模板的不同部分會導致不同子模板的行爲改變

感謝?這麼多,

+1

可能是因爲通過隔離「細節」部分中的更改而停止父模板「排行榜」來渲染,因此您不必渲染其所有子模板。這就是[這裏]所說的(http://stackoverflow.com/a/13208254/728291),但沒有信息來源。非常好的問題。 – user728291

+0

可能相關:https://github.com/meteor/meteor/issues/1210 – imslavko

回答

2

解釋可以在meteor documenation發現:

反應隔離

每個模板運行作爲自己的反應計算。當模板 訪問被動數據源(例如通過調用Session.get或 進行數據庫查詢)時,將建立一個數據依賴關係,這將導致在數據更改時重新呈現整個模板。此 表示特定更改的重新呈現量爲 ,受您將HTML劃分爲模板的方式的影響。

通常情況下,重新渲染的確切範圍並不重要,但如果您想要更多控制(例如出於性能原因),則可以使用{{#isolate}} ... {{/ isolate}幫手。 在#isolate塊內建立的數據依賴關係 已本地化爲塊,並且 本身不會導致父模板被重新呈現。該塊 幫手基本上表達了您將通過 將內容拉出到新子模板中的反應性好處。

+0

謝謝!因此,如果父模板重新呈現,其子模板將始終重新呈現? – JosephSlote

+1

如果您使用另一個名爲** [#constant](http://docs.meteor.com/#constant)**的塊,則即使父級模板被重新渲染,該塊內的代碼也不會重新渲染。在其他情況下,你是對的。 –