Meteor.js在从服务器回调后自动订阅

时间:2015-01-29 12:00:39

标签: meteor mongodb-query

我正在尝试在客户端上使用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查询有关。

2 个答案:

答案 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 中的一个被识别出来。