2014-01-11 83 views
1

我讀過Meteor template helpers fire multiple times,並試圖在不涉及任何集合的情況下重現此問題。流星模板助手在每次通話時訪問

所以我就幫助這樣的:

Template.myTemplate.helpers({ 
    test: function(){ 
     console.log("Fired"); 
     return { 
      name : "Foo" 
     }; 
    } 
}); 

而且模板看起來是這樣的:

<template name="myTemplate"> 
    {{test.name}}{{test.name}} 
</template> 

在控制檯我期望看到「炒魷魚」只有一次,但助手叫實際上兩次?因此,如果我的幫手正在訪問收集並從那裏獲取數據,那麼每當我使用{{helper.key}}時,它都會執行查詢?這是應該如何工作?

回答

1

是的你是對的模板系統會每次在你的模板中使用它時會調用一個幫助器。

我猜你在問什麼,如果這是有效的集合,因爲他們被稱爲一次又一次。

這就是爲什麼流星的.find()返回一個遊標,這是一種緩存。你可以看到這個,如果你試圖找到.find(),你會得到一個對象,但實際上並不是你的數據。遊標只會根據需要提取數據,因此它不像看起來那麼低效。

追加.fetch()實際提取數據並且不使用這個緩存,這就是爲什麼它效率較低並且經常暗示不用作幫助器的return值。

+0

感謝您的回答。但是,如果我讓我們說一個項目的編輯頁面,並且我想用值填充輸入字段,那麼我將調用{{item.keyOne}},{{item.keyTwo}},我將需要實際的數據,那麼每次都會調用fetch()?那麼如何解決這個問題呢? – SteelzZ

+0

我想你會調用一次,然後跟着緩存。因爲當你使用'item.'時,你將使用'findOne()'。無論哪種方式內存使用/差異是微不足道的操作開銷是非常低的,因爲一切都已經在內存 – Akshat

+0

我想通過我的助手中的API從另一個網站獲取一些遠程內容。對於這樣的場景? – Pramodh

相關問題