2014-04-26 85 views
0

我有中有一個搜索框,一個簡單的模板慣用的方式:流星 - 重新繪製模板

<template name="search"> 
    <input type="text" name="search" id="search" /> 
    {{> search_results}} 
</template> 

,顯然,在搜索結果的模板:

<template name="search_results"> 
    <ul> 
     {{#each results}} 
     <li>{{this.resultValue}}</li> 
     {{/each}} 
    </ul> 
</template> 

有一個事件有關搜索輸入keyp:

Template.search.events({ 
     'keyup input#search': function (e) { 
      // fetch result from db 
     } 
    }); 

我的問題是,在那裏我有註釋:fetch result from db我如何讓搜索結果模板自動更新數據庫查詢的結果?

要清楚:我可以得到的結果很好,只是不能看到如何獲得結果模板更新。

回答

1

本質上,東西在您想要重新提交的模板(search_results)必須被動,並註冊一個更改的事件。開箱即用,這意味着它可以是任何數據源listed here。由於這不會發生在你身上,我假定當你「從db中獲取結果」時,你實際上並沒有返回minimongo查詢的結果,因爲這在默認情況下是被動的。

如果是這樣,通過使用Deps.Dependency原型來滾動自己的反應性,這種問題通常最容易解決,原型(據我所知)支持除minimongo本身之外的所有其他反應性數據源。

如果您設置了var resultsChanged = new Deps.Dependency(),您將得到一個有兩種方法的對象:dependschanged。在任何您想要重新運行的計算中調用前者,並在後者註冊更改時調用前者。會話變量基本上就是這些Deps.Dependency方法分別連接到它們的getset方法的關鍵/值存儲。

所以,如果你有resultsChanged初始化,你只需要確保你的search_results模板依賴於它,通過添加一個新的輔助功能(如果results是在數據上下文而不是作爲一個輔助的調用),或修改results幫手本身。我會假設後者,但是增加一個新的幫手將是同樣微不足道的。

Template.search_results.helpers({ 
    results: function() { 
     resultsChanged.depend(); 
     // get your results from wherever 
     return results; 
    } 
}); 

這將重新運行每次resultsChanged變化,所以你只需要添加相應的代碼,在回調時獲取結果:

'keyup input#search': function (e) { 
     // fetch result from db, passing "resultsChanged.changed()" in a callback 
    } 

顯然,如果結果取是同步的,你甚至不需要傳遞迴調,你可以在下一行中完成。

我希望這有助於模糊 - 請讓我知道如果不是。如果我假設你不只是從數據庫中抽出某些東西是錯誤的,那麼這可能完全是錯誤的軌道,所以我建議在你的問題中發佈你實際的「從db獲取結果」代碼。