【发布时间】:2016-06-06 03:04:42
【问题描述】:
我正在设置一个新的 Meteor 项目,但在客户端处理集合时遇到了问题。现在我正在构建的是一个管理页面,用户可以在其中维护学校列表。
在终端中运行 meteor mongo 和 db.schools.find() 会返回一个 BSON 对象,正如我所期望的那样,但是当我在 Chrome 控制台中输入“学校”时,它会返回 Uncaught ReferenceError: Schools is not defined,这很糟糕。
我的项目架构(简化为引用 School 集合的位)如下:
client/
layouts/
admin/
schools.coffee
schools.jade
lib/
subscriptions.coffee
lib/
collections.coffee
server/
lib/
publications.coffee
每个文件的内容(按理想的加载顺序)是:
1) lib/collections.coffee
1| Schools = new Mongo.Collection('schools')
2) server/lib/publications.coffee
1| Meteor.publish('schools'), ->
2| Schools.find()
3) client/lib/subscriptions.coffee
1| Meteor.subscribe('schools')
4) client/layouts/admin/schools.coffee
76| Template.admin_schools.helpers
77| schools: ->
78| Schools.find()
79| numSchools: ->
80| Schools.find().count()
81| hasSchools: ->
82| Schools.find().count() > 0
5) client/layouts/admin/schools.jade
4| h2.admin__header Schools
5| span.admin__record-count {{numSchools}} entries
...
22| table.admin__list
23| if hasSchools
24| each schools
25| tr.admin__list-item
26| td #{name}
我还有一个新集合条目的表单,它调用Schools.insert,但错误是一样的。
当页面加载时,我收到以下错误(可能是因为它首先被调用):
debug.js:41 Exception in template helper: ReferenceError: Schools is not defined
at Object.Template.admin_schools.helpers.numSchools
这两个错误,再加上我知道集合中存在一个条目这一事实,让我相信问题在于客户端对集合存在的认识。
这种差异可能是由于加载顺序(我很确定我通过将重要文件放在lib/ 目录中来解决这个问题,尽管我希望有第二个意见),或者可能是由于拼写/语法错误(尽管没有编译错误令人费解)。也许是完全不同的东西!
非常感谢您的时间和帮助,非常感谢他们。
【问题讨论】:
-
在docs.meteor.com/#/full/structuringyourapp 的文档中,检查“文件加载顺序”部分,该部分说客户端/lib 将在/lib 之前加载。对我们有用的一种方法是在包中添加集合并导出它们(将首先加载包)。
-
一个简单的测试是在比其他文件夹最深的 lib 文件夹内有一个 lib 文件夹。 /lib/someFolder/lib/collections.coffee 之类的东西。如果这可行,那么它将首先加载最深的 lib 文件夹。
-
@Kishor 我现在有
lib/one/two/lib/collections.coffee(4 深)、lib/one/two/lib/permissions.coffee(4 深)、server/one/lib/publications.coffee(3 深)和client/lib/subscriptions.coffee(2 深),很遗憾我是仍然在页面加载时遇到与以前相同的错误。我肯定会研究包装选项,尽管这似乎比我想要的要复杂一些。除非我遗漏了什么,否则如果根lib/目录的目的是为客户端和服务器端准备东西,这不应该更容易协商吗? -
我明白了。这很奇怪。是的,它应该很简单。根据您的错误,client/layouts/admin/schools.coffee 在 lib/collections.coffee 之前加载,这不应该是这种情况。
-
Meteor.subscribe('schools')调用现在在onCreated函数中,server/one/lib/publications.coffee已被删除。当这不起作用时,我还将lib/.../collections.coffee行放入Meteor.startup函数中,但那里也没有骰子。这很棘手!非常感谢你的帮助。我会继续四处寻找,看看会发生什么。
标签: mongodb meteor collections coffeescript referenceerror