MeteorJS 和 Coffeescript

Posted

技术标签:

【中文标题】MeteorJS 和 Coffeescript【英文标题】:MeteorJS and Coffeescript 【发布时间】:2013-04-12 16:38:04 【问题描述】:

我有 /clients/client.js 、 /server/server.js 和 /model.js

在 model.js 中我有:“Lists = new Meteor.Collection("lists"); 在客户端/服务器中,我使用了这个集合。一切正常。

添加咖啡脚本后。我已将所有 js (3) 文件转换为 .coffee。删除 js 文件 并启动流星。但现在我得到了:

未捕获的引用错误:未定义列表

为什么?哪里出错了?

Lists = 新 Meteor.Collection “列表”

谢谢

【问题讨论】:

这只是一个猜测,但在 javascript 版本中,您是否故意遗漏了 var?如果没有,CoffeeScript 会自动将其放入,并包装范围,因此以前的全局变量将不再存在。 是的@phenomnomnominal 应该是正确的,如果你想从其他文件访问它们,你需要在coffeescript 中的变量前面使用@ 不太清楚@Akshat 是关于什么的,@ 在变量前面添加了this.。如果你想让一个变量全局化,你通常会做类似root = this ? exports 然后root.Lists = Lists @Akshat,this 是一个 JavaScript 概念,@ 只是它的 CoffeeScript 简写。 this 定义调用函数的上下文。在上面的示例中,使用.call,传递给.call 的第一个参数在被调用函数中变为this。除非 Meteor 做了一些新奇的事情来改变 CoffeeScript 和 JavaScript 语法,否则你不能只是笼统地声明@ 将永远是全局对象。 @phenomnomnominal 我明白你的意思,使用@ 是在 IRC 和 google 组上引入范围界定时,在流星文档和流星讨论中推荐的方式,因此我提到它。当然,它并不总是保证全球化范围,但在这个问题的上下文中,它通过以下方式解决了这个问题:@Lists = new Meteor.Collection "lists" 【参考方案1】:

请参阅http://docs.meteor.com/#coffeescript,了解如何使用@ 作为在 Meteor 环境中从 CoffeeScript 定义全局变量的便捷方式。正如 @Akshat 在 cmets 中提到的那样,Meteor 将 this 设置为全局环境的顶层以简化此操作。

【讨论】:

这仍然是推荐的方法吗?我注意到提供的链接中的文档不再提及使用@【参考方案2】:

使用coffeescript,如果你想在另一个文件中访问你的变量/函数,你需要暴露你的变量

来自流星文档

全局变量可以使用 this(或 CoffeeScript 的 @ 简写)在 CoffeeScript 中设置,因为在顶层 this 指的是全局命名空间(客户端上的窗口和服务器上的全局)。因此

@myFunction = -> 123 在顶层设置全局变量 myFunction。

所以全球化你的列表:

@Lists = new Meteor.Collection "lists";

这样model.js 中的这个可以被你的其他文件访问(它变成全局的)

【讨论】:

以上是关于MeteorJS 和 Coffeescript的主要内容,如果未能解决你的问题,请参考以下文章

使用集合的meteorJS会话

每隔一个或一个数字的车把和 MeteorJs

在基于 meteorjs (myapp://) 构建的科尔多瓦应用程序中处理深度链接

将 Bootstrap 模板添加到 MeteorJS

ExpressJS vs MeteorJS [关闭]

MeteorJS:模板助手更新后的回调