【问题标题】:Render templates from complex MongoDB queries in Meteor?在 Meteor 中从复杂的 MongoDB 查询中渲染模板?
【发布时间】:2013-08-24 03:35:46
【问题描述】:

对于这个粗略的问题,我深表歉意,但我不确定使用流星、mongo 和车把组合的最佳做法是什么。

我理解让车把变得无逻辑的意义,虽然我在 Jade 中会更舒服,但我仍然使用车把来支持原生流星。但是,我真的不知道将数据分配给模板的最佳方式可能是什么。

这尤其适用于我需要访问多个集合并访问由另一个集合中的另一个文档(按 Id)引用的文档的情况,或者我需要使用通常从 for 循环提供的索引变量的情况。保留 Meteor 的自动更新功能似乎会增加一点复杂性。

我猜,以问题的形式:

我是否应该进行复杂的查询,将它们全部连接到一个对象数组中(以便所有相关数据都嵌套),为每个对象添加一个索引变量,并使该数组可用于在模板中循环?

-或-

我是否应该在每个模板的控制器中进行每个数据库查询,然后尝试将数据分解为最简单的形式并将多组数据发送到模板?

我真的很感激任何可以引导我走向正确方向的答案。

【问题讨论】:

    标签: javascript mongodb meteor handlebars.js


    【解决方案1】:

    我建议第二种选择。可能是最简单的方法,它与反应性很好,如下所示。

    假设您有一个包含ArticlesCommentsMeteor.users 集合的博客,这些集合以可预测的方式相关——即comment 具有articleIduserId 字段。还让articlecomment 都有一个content 字段。您可以使用以下模板显示它:

    <template name="article">
        {{#with article}}
            {{content}}
            {{#each comments}}
                {{content}} - {{username}}
            {{/each}}
        {{/with}}
    </template>
    

    现在,你得到如下数据:

    Template.article.article = function() {
        return Articles.findOne(...articleId...);
    };
    
    Template.article.comments = function() {
        return Comments.find({articleId: this._id});
    };
    
    Template.article.username = function() {
        var user = Meteor.users.find(this.userId);
        return user ? user.username : '';
    };
    

    【讨论】:

    • 那么,为了松散地调整您的博客示例,如果您需要在一个页面上显示多篇文章及其 cmets,您会怎么做?你会只对同一篇文章进行多次迭代吗?您将如何传递 ID?
    • 在模板中,将#with 替换为#each。在article 助手中,将findOne(articleId) 替换为find({_id: {$in: [id1, id2, id3]}})
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 2014-12-12
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多