互联网上的许多资源(包括此处)建议使用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
中,但这看起来非常笨拙。也许我错了,但似乎应该有一个包含所有必要启动代码的通用/配置文件,并且特定控制器应该不知道它。
最后一点:我正在使用CoffeeScript,我想知道CS处理全局范围的方式是否与它有关。 (例如,在没有Posts
关键字的情况下,不是将我的var
集合定义为JS变量,而是在CS中我必须定义为@Posts
,我相信它使它成为窗口的属性。)
答案 0 :(得分:3)
是的,你这样做:
Meteor.startup ->
Posts.allow(
...
)
基本上,任何使用另一个文件中定义的变量的代码都应该以{{1}}开头,除非你确定加载顺序是正确的(例如,变量在lib中)。 p>
是的,加载订单选择不当。
答案 1 :(得分:0)
我强烈建议您考虑完全使用智能套餐。这就是流星本身的写作方式。
我在这里详细介绍:http://www.matb33.me/2013/09/05/meteor-project-structure.html