【问题标题】:Meteor - rendering template with a document from a CollectionMeteor - 使用集合中的文档渲染模板
【发布时间】:2012-04-16 08:48:38
【问题描述】:

基本上,我只是尝试使用 MongoDB find() 调用返回的文档的 result 属性来呈现模板。我开启了自动订阅。

我有一个 html 模板

<template name="results">
    status: {{result}}
</template>

我正在尝试在 js 文件中渲染它:

if (Meteor.is_client) {
    Template.results.result = function() {
        return Results.find({'type': 'test'}).fetch()[0].result;
    }
}

在 mongo {type: "test", result: "success"} 中有一条记录。代码不断抛出“未定义没有属性结果”的错误。但是,当我只返回 Results.find({'type': 'test'}).fetch()[0] 时,它实际上确实返回了一个对象,而不是未定义的(如果我将它记录到控制台,我可以看到它确实具有我设置的 result 属性)。

我唯一能想到的是它可能与流星的反应行为有关——也许 MongoDB 调用最初返回未定义,然后更新以包含正确的文档。那是对的吗?如果是这样,我怎样才能获得该文档的result 属性的值?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    您的模板在客户端启动后立即呈现,在服务器发送结果中的文档之前。试试这个(findOnefetch()[0] 的简写):

    Template.results.result = function() {
        var obj = Results.findOne({'type' : 'test'});
        return obj && obj.result;
    }
    

    【讨论】:

    • 如果您的 findOne 位于方法内部并且 Template.this.that 正在调用该方法,该怎么办。该方法也被其他不面向模板的代码调用,并且在您返回 obj && obj.result 时出错?你怎么处理那个案子?我遇到了这个问题,如果不需要,我不想打开另一个线程。
    • 这个的用例是什么?模板可能不应该是调用方法。每当屏幕重绘时,您都会往返于服务器。 Meteor 方法是订阅驱动模板的数据,以便屏幕绘制补偿往返的延迟。
    • 忽略,不得不编辑,回答错误。我会试试的。但我想做的是减少代码重复。 Template.this.that = function() { var obj = myObject.myMethodGetData(Session.get("search_value"));返回对象; };允许其他代码调用 myObject.myMethodGetData 以获取该数据。
    • 顺便说一句,被调用的方法在 /client/ 中,也许我应该在此打开一个 SO?数据已经订阅到客户端。
    • 对不起所有的 cmets,我们在 IRC 中发现了这一点,要点是 here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2014-12-12
    • 2015-07-13
    • 1970-01-01
    • 2014-06-14
    • 2014-12-08
    相关资源
    最近更新 更多