【发布时间】:2016-08-22 16:24:45
【问题描述】:
我正在尝试遵循here 概述的“在模板助手中使用 Meteor 方法的返回值”模式,集合除外。
基本上,我有这样的事情:
(服务器端)
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 之类的东西并进行全文搜索,据我所知,基本上只能通过服务器获得-side 方法调用(而不是在客户端的 mini-mongo 中)。
编辑
好的,所以我迁移了发布/订阅的东西,总体而言它们正在工作,但是当我尝试将其设置为会话值是选择器时,它无法正常工作。可能是我把“订阅”放在哪里的问题。
所以,我有一个带有参数“选择器”的发布(目的是传入 mongo 选择器)。
在客户端,我订阅如下:
Meteor.subscribe('my-collection-query', Session.get("my-collection-query-filter"));
但它的行为参差不齐。在一篇文章中,它建议将这些放在Templates.body.onCreate 上。这有效,但不会导致某些反应(即,当我在控制台上更改该会话值时,它不会更改显示的值)。
所以,如果我遵循另一篇文章的建议,它会将订阅权放在调用该集合的模板的相关帮助函数中。这很好用,但如果我有 MULTIPLE 模板调用该集合,我必须将订阅添加到每个模板才能正常工作。
这些似乎都不对。我认为“订阅”是“放下管道,让它们在那里工作”,但这可能是错误的。
我会继续阅读文档。也许在某个地方,订阅的范围得到了适当的解释。
【问题讨论】:
-
在进一步阅读之后,有迹象表明“使用发布/订阅并删除自动发布”——但这真的是唯一的方法吗?
-
你得到了什么?任何错误信息?您可以在回调中使用 if(error) { console.error(error) }
-
不,回调根本没有被调用。在这个somewhat-related 问题中,他们很好地解释了游标不是 json 可序列化的对象,所以如果我想支持全文搜索,我怀疑发布确实是唯一的方法。
标签: meteor