流星 - 重新渲染模板的惯用方式

时间:2014-04-26 17:26:46

标签: meteor

我有一个简单的模板,里面有一个搜索框:

<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查询的结果自动更新搜索结果模板?

要明确:我可以很好地获得结果,但是无法看到如何更新结果模板。

1 个答案:

答案 0 :(得分:1)

基本上,要重新呈现的模板中的某些search_results)必须是被动的并注册已更改的事件。开箱即用,这意味着它可以是任何数据源listed here。由于这种情况不会发生,我假设当你“从db中获取结果”时,你实际上并没有返回minimongo查询的结果,因为默认情况下它会被反应。

如果是这样,通过使用Deps.Dependency原型滚动自己的反应性,这种问题通常最容易解决,原型(据我所知)支持除了minimongo本身以外的所有其他反应数据源。 / p>

如果设置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获取结果”代码。