【发布时间】:2011-09-15 15:25:52
【问题描述】:
我想通过使用关键字“with”在 javascript 中使用命名空间,但 CoffeeScript 将此报告为保留关键字并拒绝编译有什么方法可以在 cs 中使用命名空间吗?
特别是,我想动态包含一个 CoffeeScript 文件(受信任的源),例如为数据库模式加载模型,但我希望包含的脚本能够访问本地命名空间。
编辑:
这就是我想要做的。我正在建立一个 web 框架,将目录树映射到基于 express 和 mongoose 的应用程序。例如,有一个子目录“models”,其中包含一个文件“user.coffee”,其中包含如下代码:
name:
type: String
unique: on
profiles: [ Profile ]
其中Profile 是一个位于名为model 的本地对象中的类。加载用户模型时,我希望它访问位于本地模型存储中的模型类。
我现在的解决方法是将model.Profile 写入文件'user.coffee'。希望我的意思很清楚。
第二次编辑
这是我在不使用 with 的情况下是如何做到的:
user.coffee
name:
type: String
unique: on
profiles: [ @profile ]
profile.coffee
content: String
它是如何动态加载的:
for fm in fs.readdirSync "#{base}/models"
m = path.basename fm, '.coffee'
schema[m] = (()->
new Schema coffee.eval (
fs.readFileSync "#{base}/models/#{fm}", 'utf8'
), bare: on
).call model
mongoose.model m, schema[m]
model[m] = mongoose.model m
对我来说似乎是一个不错的解决方案。
【问题讨论】:
-
恐怕您的编辑并没有使您的意图更加清晰。您能否添加
model.Profile的代表代码以及您希望如何使用它? -
定义时在
Profile前面加上@:class @Profile。由于this是global,这将使它成为一个名为Profile的全局变量。user.coffee无需更改(尽管您可以编写@Profile以更清楚地表明您正在引用全局)。 -
Profile 是一个猫鼬模式,它的动态定义方式与 User 相同:通过 CoffeeScript 文件。 profile.coffee 在这种情况下。请参阅 github.com/LearnBoost/mongoose 和 mongoosejs.com - 所以我无法全局定义它。尽管如此,我还是想避免全局定义。不过,我会试试 @ - 它是 CoffeeScript 中
this的同义词,对吧? -
好吧,如果
@编译成this,我就不能在其他函数中使用它,比如回调,因为它会引用那个函数... -
顺便说一句,我现在考虑使用
coffee.eval不是一个好主意。相反,可以只使用require来解析 coffe-script 文件。
标签: javascript namespaces coffeescript