Я пытаюсь использовать функцию автоматической подписки Meteor на клиенте, но иногда она работает, а иногда нет. Итак, вот случай:
Рабочая версия: у меня есть раскрывающийся список, заполненный каналами. Когда пользователь нажимает на канал, я устанавливаю переменную сеанса и начинаю загружать потоки:
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.
#channelLink"
? - person ajduke   schedule 29.01.2015