如何使用Meteor.startup修复文件加载顺序问题?

时间:2014-01-10 03:51:39

标签: javascript coffeescript meteor

互联网上的许多资源(包括此处)建议使用Meteor.startup来修复由JS文件加载的顺序引起的依赖性问题。但是,没有人明确说明这是如何实现的。

具体来说,似乎文件顺序依赖是我无法获取posts.coffee集合以识别在permissions.coffee中定义的权限的原因。我认为这是因为posts.coffee在/ lib / collections中,而permissions.coffee在/ lib中,并且子目录中的文件首先被加载。 (顺便说一句,我更喜欢/ collections在根目录中,但我不得不先将它移到/ lib中以解决类似的问题。)

这是我的posts.coffee:

@Posts = new Meteor.Collection('posts')

Posts.allow(
  update: ownsDocument
  remove: ownsDocument
)

Meteor.methods(
  ...

这是我的permissions.coffee:

@ownsDocument = (userId, doc)->
  doc && doc.userId == userId

(顺便说一下,这些都来自“发现流星”一书的教程,围绕these commits,但在CoffeeScript中除外。)

我的问题:假设我对问题的分析是正确的,您将如何使用Meteor.startup解决问题?我This answer很难解释;一种解释是我应该以某种方式将Posts.allow(...)包裹在Meteor.startup中,但这看起来非常笨拙。也许我错了,但似乎应该有一个包含所有必要启动代码的通用/配置文件,并且特定控制器应该不知道它。

顺便说一句,我知道我可以通过利用Meteor的默认文件加载排序规则(例如/ lib first;子目录优先; main。* last;按字母顺序排列)来破解解决方案,但这对于应该是什么来说是一个非常不优雅的解决方案简单的问题。我不想在文件名前添加“a”或创建虚假目录只是为了让它在另一个文件之前加载。

最后一点:我正在使用CoffeeScript,我想知道CS处理全局范围的方式是否与它有关。 (例如,在没有Posts关键字的情况下,不是将我的var集合定义为JS变量,而是在CS中我必须定义为@Posts,我相信它使它成为窗口的属性。)

2 个答案:

答案 0 :(得分:3)

是的,你这样做:

Meteor.startup ->
  Posts.allow(
    ...
  )

基本上,任何使用另一个文件中定义的变量的代码都应该以{{1​​}}开头,除非你确定加载顺序是正确的(例如,变量在lib中)。 p>

是的,加载订单选择不当。

答案 1 :(得分:0)

我强烈建议您考虑完全使用智能套餐。这就是流星本身的写作方式。

我在这里详细介绍:http://www.matb33.me/2013/09/05/meteor-project-structure.html