繁体   English   中英

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

[英]how to export variables from coffeescript in meteor packages

我对如何将导出的变量与coffeescript流星包一起使用感到困惑。

[编辑]具体示例。 我遵循了各种建议,并拥有一个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)

一切正常。

当前要解决的问题是定义所有挂断的share.Ribot是流星的coffeescript支持。

所以对于第一步,我实际上不需要将Ribot对象导出到程序包之外,因为大多数接口当前都是通过Meteor.methods进行的,但是最终我还是需要这样做。


详情如下

有更复杂的建议 ,但我发现在程序包中起作用的是与普通CS应用程序开发相反的情况。

例如:

Rbot = {}   # no @ on declaration

Meteor.startup ->
  @RBot = new Thing()    # use @ in references
  console.log("new Rbot", @RBot)

然后在package.js中

api.export(['RBot']);

现在可供该应用使用。

但是,在我的应用程序(而非程序包)中正常使用coffeescript时,情况恰恰相反。 例如

# 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)

这似乎也与正常的咖啡脚本在流星以外的工作方式不同(请参阅下文)。

在应用程序中,我认为这可能是因为流星正在调用与顶层窗口相同的“ this”对象的方法? 那么还有另一层“魔术”正在发生吗? 而在一个包中,Meteor所包装的封包比Coffeescript本身要多。

如果有人可以建议这样做的“正确”方法,或者解释为什么在同一个框架中需要使用这两种相反的wrapper / @ 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);

如果在包中写入@myVariable = value ,则无需导出myVariable因为没有名为myVariable包变量 ,因为您已将其作为新属性附加到全局对象。 但是,您应该避免这样做,因为包不应修改全局对象,而应导出其某些包变量。

但是,必须将包变量定义为全局变量(在JavaScript中: myVariable = value (而不是 var myVariable = value ),缺点是CoffeeScript中没有等效语句(在CoffeeScript中, myVariable = value编译为var myVariable = value ,它创建一个文件范围的变量)。为了解决这个问题,流星人引入的shared变量(含有的对象),并且这个想法是,包范围的变量应该被指定为属性到该对象。了解更多关于它在该文档对流星中的CoffeeScript

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM