我正在尝试遵循“使用模板助手中的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
上。这有效,但不会导致反应(即当我在控制台上更改该会话值时,它不会更改显示的值)。
因此,如果我按照另一篇文章的建议,它会将订阅权限放在调用该集合的模板的相关帮助函数中。这很好用,但是如果我有多个模板调用该集合,我必须将订阅添加到它们中的每一个才能工作。
这些都不是正确的。我认为“订阅”是“放下管道并让它们留在那里工作”,但这可能是错误的。
我会继续阅读文档。也许在某个地方,正确解释了订阅的范围。
答案 0 :(得分:0)
您需要发布您的数据并在您的客户端订阅它。 如果你没有删除" autopublish"然而,你所拥有的一切将自动发布。因此,当您在客户端上查询集合时(例如,在辅助方法中),您将获得结果。此软件包仅用于快速开发和原型设计,但在实际应用程序中应将其删除。您应该根据应用程序的需求和用例发布数据。 (并非所有用户都必须查看所有用例中的所有数据)