流星发布/订阅混淆

时间:2014-04-30 12:38:45

标签: javascript meteor

所以,在我的 server.js 中,我有以下代码来限制客户端收到的内容:

Meteor.publish('customerList', function()
{
    return Meteor.users.find({roles: 'customer'}, {fields: {profile: 1}});
});

我只想找到有'角色的用户。价值'客户',使用Roles包。然后在 client.js 上我在订阅中另外find()

Meteor.subscribe('customerList', function()
{
    var foundCustomers = Meteor.users.find().fetch();

    Session.set('foundCustomers', foundCustomers); //i have a Session.get elsewhere which returns this cursor
});

在我的模板中,我将这些值显示为:

<template name="customer_search_result">
    {{#each customers}}
        <div>{{profile.firstname}} {{profile.lastname}}, {{profile.tel}}</div>
    {{/each}}
</template>

那么当我现在看到这个列表中的所有不同角色时,我做错了什么?如果我在订阅的find()中添加与我发布的相同的规则,那么我们根本就没有结果。

2 个答案:

答案 0 :(得分:1)

您的发布和模板看起来很好,您只需要更改您的订阅:

Meteor.subscribe('customerList');

然后你需要一个模板助手:

Template.customer_search_result.helpers({
    customers: function(){
        return Meteor.users.find({roles: 'customer'}, {fields: {profile: 1}});
    }
})

答案 1 :(得分:1)

由于还有另一个发布employee的出版物,您需要在订阅回调中仅从customer获取Meteor.users,否则您可能会得到一些employee 1}}也是。首先,将roles添加到已发布的字段中(我认为这不是问题):

Meteor.publish('customerList', function()
{
    return Meteor.users.find({roles: 'customer'}, {fields: {profile: 1, roles: 1}});
});

然后更新订阅功能:

Meteor.subscribe('customerList', function()
{
    var foundCustomers = Meteor.users.find({roles: 'customer'}).fetch();
    Session.set('foundCustomers', foundCustomers);
});

顺便说一句,通过fetch光标并将结果存储在会话中,您将破坏反应性。如果这是故意的 - 您只需要一次性的客户快照 - 您应该考虑在完成后停止订阅,否则服务器将继续向客户发送从未使用过的新客户:

var customerListSubscription = Meteor.subscribe('customerList', function()
{
    var foundCustomers = Meteor.users.find({roles: 'customer'}).fetch();
    Session.set('foundCustomers', foundCustomers);
    customerListSubscription.stop();
});

如果你想要反应,请参阅Kelly Copley的回答。