【发布时间】:2014-01-28 22:19:34
【问题描述】:
互联网上的许多资源(包括此处)建议使用Meteor.startup 来解决由 JS 文件加载顺序引起的依赖问题。但是,没有人详细说明这是如何实现的。
具体来说,文件顺序依赖性似乎是我无法让我的 posts.coffee 集合识别在我的 permissions.coffee 中定义的权限的原因。我认为这是因为posts.coffee 在/lib/collections 中,而permissions.coffee 在/lib 中,子目录中的文件首先被加载。 (顺便说一句,我更希望 /collections 位于根目录中,但之前我不得不将它移动到 /lib 以解决类似的问题。)
这是我的帖子。咖啡:
@Posts = new Meteor.Collection('posts')
Posts.allow(
update: ownsDocument
remove: ownsDocument
)
Meteor.methods(
...
这是我的权限。咖啡:
@ownsDocument = (userId, doc)->
doc && doc.userId == userId
(顺便说一句,这全部来自“发现流星”书籍教程,在 these commits 附近,CoffeeScript 除外。)
我的问题:假设我对问题的分析是正确的,您将如何使用Meteor.startup 解决它? This answer 我很难解释;一种解释是我应该以某种方式将Posts.allow(...) 包装在Meteor.startup 中,但这似乎很笨拙。也许我错了,但似乎应该有一个包含所有必要启动代码的通用/配置文件,而特定的控制器应该对此一无所知。
顺便说一句,我意识到我可以利用 Meteor 的默认文件加载排序规则(例如 /lib 优先;子目录优先;main.* 最后;按字母顺序)来破解解决方案,但这对于应该是简单的问题。我不想在文件名前附加“a”或创建虚假目录只是为了让它在另一个文件之前加载。
最后一点:我正在使用 CoffeeScript,我想知道 CS 处理全局范围的方式是否与它有关。 (例如,不是将我的 Posts 集合定义为没有 var 关键字的 JS 变量,而是在 CS 中我必须将其定义为 @Posts,我相信这使它成为窗口的属性。)
【问题讨论】:
-
您是否将所有集合的所有权限放在一个文件中?将允许/拒绝规则放在与集合定义相同的文件中可能会更容易、更有条理。此外,使用特定于特定实现细节的函数(如
@ownsDocument函数)破坏全局命名空间通常是不好的做法。但听起来问题确实出在您想要的目录结构上。除了集合之外,您的应用程序的某些部分是否需要访问permissions.coffee?如果是供集合使用的代码库,放在lib/collections/lib/ -
另一种解决方案可能是将您的收藏代码抽象为 Meteorite 包(只需将其放在
packages/中,不要将其发布到 Atmosphere)。这使您可以完全控制目录结构和文件加载顺序。
标签: javascript coffeescript meteor