如何通过流星方法使用collection.find?

时间:2016-04-28 05:01:08

标签: meteor

我正在尝试遵循“使用模板助手中的Meteor方法的返回值”模式here,除了集合。

基本上,我有这样的事情:

(服务器端)

Meteor.methods({
    queryTest: function(selector) {
        console.log("In server meteor method...");
        return MyCollection.find(selector);
    }
});

(客户端)

Meteor.call('queryTest', {}, function(error, results) {
    console.log("in queryTest client callback...");

    queryResult = [];
    results.forEach(function(result) {
        // massage it into something more useful for display
        // and append it to queryResult...
    });

    Session.set("query-result", queryResult);
});

Template.query_test_template.helpers({
    query_test_result: function() {
        return Session.get("query-result");
    }
});

问题是,我的回调(来自Meteor.call)甚至没有被调用。

如果我用'return“foo”'替换方法,那么回调就会被调用。此外,如果我在查找中添加“.fetch()”,它也会显示正常(但不再反应,这会破坏其他所有内容)。

是什么给出的?为什么不调用回调?我觉得我很亲密,只需要正确的咒语......

如果真的很重要:我在客户端做了所有的查询就好了,但是想尝试使用_ensureIndex这样的全文搜索,从我所知道的,基本上只能通过服务器获得方法调用(而不是客户端上的mini-mongo)。

修改

好的,所以我迁移了发布/订阅的内容,总体来说它们正在工作,但是当我尝试将其设置为会话值是选择器时,它无法正常工作。可能是我订购“订阅”的地方。

所以,我有一个带有参数“selector”的发布(意图是传入mongo选择器)。

在客户端上,我订阅了:

Meteor.subscribe('my-collection-query', Session.get("my-collection-query-filter"));

但它有不稳定的行为。在一篇文章中,它建议将这些文章放在Templates.body.onCreate上。这有效,但不会导致反应(即当我在控制台上更改该会话值时,它不会更改显示的值)。

因此,如果我按照另一篇文章的建议,它会将订阅权限放在调用该集合的模板的相关帮助函数中。这很好用,但是如果我有多个模板调用该集合,我必须将订阅添加到它们中的每一个才能工作。

这些都不是正确的。我认为“订阅”是“放下管道并让它们留在那里工作”,但这可能是错误的。

我会继续阅读文档。也许在某个地方,正确解释了订阅的范围。

1 个答案:

答案 0 :(得分:0)

您需要发布您的数据并在您的客户端订阅它。 如果你没有删除" autopublish"然而,你所拥有的一切将自动发布。因此,当您在客户端上查询集合时(例如,在辅助方法中),您将获得结果。此软件包仅用于快速开发和原型设计,但在实际应用程序中应将其删除。您应该根据应用程序的需求和用例发布数据。 (并非所有用户都必须查看所有用例中的所有数据)