我对如何将导出的变量与coffeescript meteor包一起使用感到困惑。
[编辑]具体的例子。
我遵循了各种建议,并有一个JS文件_defines.js
//defines.js
Ribot = {}
然后
# server.coffee
Meteor.startup ->
Ribot = new Bot()
Meteor.methods botReply: (obj) ->
reply = Ribot.reply("user", obj.text)
所以问题是启动块中的Ribot对象在流星方法块中不可用。
当我用javascript编写类似的代码时:
Meteor.startup( function() {
Ribot = new Bot();
Meteor.methods({
botReply: function(obj) {
reply = Ribot.reply("user", obj.text)
事情很好。
根据流星的coffeescript支持,目前正在进行的黑客攻击定义了所有内容以挂起share.Ribot
。
因此,对于第一步,我实际上并不需要将Ribot对象导出到包外,因为大多数界面当前都是通过Meteor.methods,但我最终还是需要。
详情如下
There are more complicated suggestions,但我发现在包中有效的方法与正常的CS应用程序开发相反。
例如:
Rbot = {} # no @ on declaration
Meteor.startup ->
@RBot = new Thing() # use @ in references
console.log("new Rbot", @RBot)
然后在package.js
api.export(['RBot']);
它现在可供应用使用。
然而,在我的应用程序(不是包裹)中使用正常的咖啡因时,情况正好相反。例如
# use @ when declaring
@SceneData = new Meteor.Collection("SceneData")
Meteor.startup ->
if Meteor.isServer
Meteor.publish "SceneData", (query, fields) ->
# dont use @ when referencing
return SceneData.find(query, fields)
这似乎与正常的coffeescript在流星之外的工作方式不同(见下文)。
在app中,我认为这可能是因为流星正在使用"这个"对象与顶级窗口相同?所以还有另一层"魔法"继续? 而在一个包中Meteor正在包装比coffeescript本身更多的封闭。
如果有人可以建议"对"这样做的方法,或解释为什么在同一框架中需要这两个相反的包装/ @ ref样式,这是有启发性的。
编译器示例:
@outer = "outer"
inner = "inner"
p1 = () ->
console.log @outer # wont run
console.log(outer)
p2 = () ->
console.log inner
console.log @inner
p3 = () =>
console.log @outer
console.log(outer)
p1()
p2()
p3()
// compiles to:
(function() {
var inner, p1, p2, p3;
this.outer = "outer";
inner = "inner";
p1 = function() {
console.log(this.outer);
return console.log(outer);
};
p2 = function() {
console.log(inner);
return console.log(this.inner);
};
p3 = (function(_this) {
return function() {
console.log(_this.outer);
return console.log(outer);
};
})(this);
p1();
p2();
p3();
}).call(this);
答案 0 :(得分:0)
如果您在包中写了@myVariable = value
,则不需要导出myVariable
,因为没有名为{{1}的包变量因为您已将其作为新属性附加到全局对象。但是,您应该避免这样做,因为包不应该修改全局对象,而是导出一些包变量。
但是,包变量必须定义为全局变量(在JavaScript中:myVariable
(和不 myVariable = value
),缺点是没有CoffeeScript中的等效语句(在CoffeeScript var myVariable = value
中编译为myVariable = value
,这会创建一个文件范围变量)。为了解决这个问题,流星人员引入了var myVariable = value
变量(包含一个对象),并且我们的想法是应该将包范围变量指定为此对象的属性。请在the docs for CoffeeScript in Meteor中详细了解它。