我有一个简单的模板,里面有一个搜索框:
<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
如何使用db查询的结果自动更新搜索结果模板?
要明确:我可以很好地获得结果,但是无法看到如何更新结果模板。
答案 0 :(得分:1)
基本上,要重新呈现的模板中的某些(search_results
)必须是被动的并注册已更改的事件。开箱即用,这意味着它可以是任何数据源listed here。由于这种情况不会发生,我假设当你“从db中获取结果”时,你实际上并没有返回minimongo查询的结果,因为默认情况下它会被反应。
如果是这样,通过使用Deps.Dependency
原型滚动自己的反应性,这种问题通常最容易解决,原型(据我所知)支持除了minimongo本身以外的所有其他反应数据源。 / p>
如果设置var resultsChanged = new Deps.Dependency()
,则会得到一个包含两种方法的对象:depends
和changed
。在要更改时要重新运行的任何计算中调用前者,后者注册更改。会话变量基本上只是键/值存储,这些Deps.Dependency
方法分别附加到get
和set
方法。
因此,如果您已初始化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获取结果”代码。