我正在尝试在客户端上使用meteor autosubscribe功能,但有时它可以工作,有时它不会。所以情况就是这样:
工作版本:我有下拉列表,其中填充了频道。当用户点击频道时,我设置会话变量并开始加载线程:
Template.channelDropdown.events({
"click #channelLink": function() {
Session.set("currentChannel", this);
}
});
HTML
<ul class="dropdown-menu">
{{#each channels}}
<li>
<a id="channelLink" href="#">{{name}}</a>
</li>
{{/each}}
</ul>
和
Tracker.autorun(function() {
Meteor.subscribe("threadsByChannel", Session.get("currentChannel"));
});
Meteor.publish("threadsByChannel", function (channel) {
return threads.find({channel: channel});
});
并加载线程:
"channelThreads": function() {
return threads.find({channel: Session.get("currentChannel")}).fetch();
},
现在这个有效。但是我有其他方法来打开不起作用的频道。可以输入通道名称,如果它不存在,则创建通道名称,否则返回现有通道名称。
Template.channelSearchBar.events({
"submit #joinChannelForm": function() {
event.preventDefault();
var channelName = $("#channelNameField").val();
Meteor.call("getChannelByName", channelName, function(error, result) {
if (error) {
// TODO error handling
} else {
Session.set("currentChannel", result);
}
});
$("#channelNameField").val("");
}
});
服务器:
'getChannelByName': function (channelName) {
var channel = channels.findOne({name: channelName});
if (channel) {
return channel;
} else {
var newChannel = {
name: channelName
}
return channels.insert(newChannel);
}
}
HTML
<template name="channelSearchBar">
<form id="joinChannelForm" class="navbar-form navbar-left" role="search">
<div class="form-group">
<input id="channelNameField" type="text" class="form-control" placeholder="Enter channel name">
</div>
<button type="submit" class="btn btn-default">Join</button>
</form>
</template>
现在唯一的区别是会话变量是在回调中设置的。我很确定这是问题,因为它是对服务器的异步调用,并且在请求时不会在客户端填充线程。当我在加载线程函数(客户端上的 threads.find())中设置断点时,我看到会话变量已正确设置,但它不会返回任何内容。有时它被调用两次(例如,在第一种情况下,第一次调用返回任何内容,然后第二次调用由于某种原因返回实际结果。这是它假设工作的方式吗?)。我刚刚开始学习流星并试图了解它是如何工作的。如果有人能以正确的方式解释或指导我,我会很高兴的。
编辑:非常奇怪。我已经在发布函数中放置了断点,它似乎工作正常 - 完全像它应该。然而,在非工作情况下,它只是从服务器端返回任何内容,即使工作和非工作情况都提供(看似)完全相同的通道对象。似乎问题与mongodb查询有关。
答案 0 :(得分:0)
为什么不删除Meteor.call
,并在客户端执行所有操作?,Autorun上的订阅似乎没问题,让我们尝试使用此代码,只需确保您拥有{{ 1}}权限顺序。
allow/deny
答案 1 :(得分:0)
好吧似乎真正的问题不是流星发布/订阅错误,而是因为mongodb查询没有识别通道对象。通过改变这个问题解决了问题:
threads.find({channel: channel})
到此:
threads.find({"channel.name": channel.name})
我发现mongo查询关心对象参数的顺序,但是channel目前只有一个参数(名称),所以我仍然不确定为什么它们不被认为是平等的。一个频道从 findOne 查询返回,另一个频道从 find 返回。 find 中的一个被识别出来。