【问题标题】:Meteor publishes even when autopublish is removed即使删除自动发布,Meteor 也会发布
【发布时间】:2014-11-26 17:14:18
【问题描述】:

我正在使用 Meteor 1.0

我有以下代码:

/lib/collections.js

Members = new Mongo.Collection('members');

/lib/router.js

Router.configure({
    layoutTemplate: 'layout',
    loadingTemplate: 'loading',
    notFoundTemplate: 'notFound',
    waitOn: function() { return Meteor.subscribe('members'); }
});

Router.route('/', {name: 'menu'});
Router.route('/member/new/', {name: 'memberNew'});
Router.route('/member/renew/', {name: 'memberRenewal'});

/server/publications.js

Meteor.publish('members', function() {
    console.log("Publishing....");
    return Members.find();
});

/client/templates/memberList.js

Template.membersList.helpers({
    listMembers: function() {
        return members.find().fetch();    >>>>>> Error line
    }
});

我收到以下错误:

Exception in template helper: ReferenceError: members is not defined
at Object.Template.membersList.helpers.listMembers
(http://meteorvb.dhcp.meraka.csir.co.za:3000/client/templates/membersList.js?

如果我将 /client/templates/memberList.js 更改为读取,我已删除自动发布位

Template.membersList.helpers({
    listMembers: function() {
        return Members.find().fetch();    
    }
});

一切正常。

谁能帮帮我?

【问题讨论】:

  • 不清楚您的问题是什么。该错误是由于集合被称为“Members”且大写 M,但您放置了“members”。然后你在你的代码中修复了它并且它起作用了。有什么问题?
  • 感谢您的回复 - 我从流星书中了解到,如果您从 Meteor 中删除自动发布,客户将无法直接访问“成员”集合,但必须使用订阅“成员” .我理解错了吗?
  • members 既是 MongoDB 中的集合名称,也是 Meteor 用来确定与哪个客户端集合同步您在服务器上发布的数据的名称。但它不是 JS 对象,只是一个名称。 Members 是附加了 Meteor API 的 JS 对象,允许您在该集合中搜索/插入/删除/等。真的,这只是 MongoDB 或 MiniMongo 集合的包装器,内置 API 和 pub/sub 逻辑。
  • 通过删除自动发布,您必须手动发布您正在执行的收藏。集合的名称是“members”,因为这是您在创建它时给出的名称。但是,引用该集合的 Javascript 对象称为 Members (Members = new Mongo.Collection('members');),而 find() 是该 object 上的一个方法。
  • 澄清一下,如果您愿意,JS 集合对象可以是服务器上的Foo 和客户端上的Bar,并且如果双方都将members 作为集合提供,则仍然可以正确同步名称属性。但这将是相当愚蠢的,因为您必须记住在服务器上执行 Foo.find() 并在客户端执行 Bar.find(),这就是为什么没有人会这样做的原因。

标签: meteor meteor-publications


【解决方案1】:

我认为这只是一个错字,您使用小写的 m 而不是大写的 M 代表成员。

Template.membersList.helpers({
    listMembers: function() {
        return Members.find().fetch();    >>>>>> Error line
    }
});

变量区分大小写,由于成员集合已分配给“成员”,因此您需要在其他地方将其称为“成员”。

Members = new Mongo.Collection('members');

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多