如何在流星包中从coffeescript导出变量

时间:2015-01-28 03:17:00

标签: javascript meteor coffeescript

我对如何将导出的变量与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);

1 个答案:

答案 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中详细了解它。