加载顺序:Meteor.js和Coffeescript

时间:2014-11-06 17:10:47

标签: javascript meteor coffeescript

我在加载顺序上看到了一些东西,但是自1.0发布以来,情况似乎发生了变化。让我来说明我所看到的,也许有人可以告诉我我做错了什么:

+ root-dir
|
+ - other stuff
|
+ main.coffee  <- global declarations
|
+ lib
  |
  + - charger_collection.coffee
  |
  +- charger_schema.coffee

这几乎应该涵盖它。现在,我意识到这不是当前的最佳实践,我不反对改变,但我需要理解为什么会出现以下问题。 main.coffee包含以下内容:

# Share globably accessible stuff like collections by
# attaching to 'this'

@Chargers = new Mongo.Collection("chargers")

在其他文件中对@Chargers的引用可以正常工作。 E.g:

# client/chargers.coffee

Template.chargers.helpers
  list: ->
    return Chargers.find({}, {limit:50})

但是,问题在于以下使用Collection2(摘录)的用法:

# lib/charger_schema.coffee

@Schemas = {}

@Schemas.Charger = new SimpleSchema
  id:
    type: Number
    optional: false
  name:
    type: String
    label: "Name"
    max: 200
  site_id:
    type: Number
    label: "Site ID"
  "address.street":
    type: String
    label: "Street"
  "address.city":
    type: String
    label: "City"
    optional: true

@Chargers.attachSchema Schemas.Charger # <= TypeError: Cannot call method 'attachSchema' of undefined

如果我使用@ChargersChargers,则会出现同样的错误。

两个问题:

  1. 为什么会出现可见性问题?

  2. 如何最好地修复?

  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

仔细查看文档中的structuring your app部分。相关部分是:

  

所有匹配main。*的文件都会在其他所有文件后移动,并保留其顺序。

所以你的结构与你想要的结果正好相反 - 它在其他所有东西加载之后声明了集合。建议您的集合定义在/lib下,以便首先加载它们。通常在/lib/collections之类的情况下,/lib中的其他文件都将具有集合定义(首先加载深层嵌套文件)。

您可能还需要考虑将charger_collection.coffeecharger_schema.coffee的内容和集合定义移动到同一文件中,以避免它们之间存在依赖性问题。或者,您可以使用嵌套目录或命名约定(文件在同一目录中按字母顺序加载)来解决问题。