你如何管理Meteor中的命名空间?

时间:2015-09-25 12:23:25

标签: javascript meteor javascript-namespaces

所以这是我的问题: 目前,我在模板js文件中有很多与WEBRTC相关的功能。我的目标是将这些函数放在一个单独的文件中,例如webRTCWrapper.js,并在我的模板中调用这些函数而不使用全局变量。

我认为我必须使用名称空间,我是否正确? 如果是这样,你如何使用它们?

编辑:对于任何有兴趣的人,这正是我所寻找的:

http://themeteorchef.com/snippets/using-the-module-pattern-with-meteor/

3 个答案:

答案 0 :(得分:1)

您可以使用在该对象中具有全局对象和函数的常见模式。

Greetings = {
   hello: function(name) { return "Hello "+name+" how are you?"; }
}

然后你可以在模板助手中调用它:

Template.GreetingsTemplate.helpers({
   sayHello: function() { return Greetings.hello('Maxence'); }
})

记下Meteor中文件的加载顺序,首先加载lib文件夹中的任何内容。如果遇到没有定义“Greetings”对象的问题,那么因为该文件尚未加载。

编辑: 您可以重复使用相同的模式在不同的文件中添加更多功能(您可以使用App = App || {},但它会在Chrome中引发错误)。

App = (typeof App === 'undefined')? {} : App;
App.someFunction = function(){};

甚至,如果你使用underscore.js:

App = (typeof App === 'undefined')? {} : App;
_.extend(App, {
  someFunction: function(){}
});

答案 1 :(得分:1)

创建一个名为packages/的目录,与您的.meteor/目录平行。您可以创建导出单个对象/函数的包。在命令行上,使用meteor create --package <yourpackagename>meteor add <yourpackagename>您可以编辑js文件以添加命名空间。

MyNamespace = {};
MyNamespace.myFunction = function () { };

然后,在package.js中,只需导出该命名空间。

api.export('MyNamespace');

答案 2 :(得分:0)

从现在开始,使用来自另一个文件的代码的常规方法是通过全局(服务器和客户端)。正如Joao所建议的那样,你可以创建自己的全局App变量,在那里存储或更一般地存储global MODULE变量(与Joao基本相同,但有解释)。

但随着ES2015支持的到来,我们很快就能有一个官方模式来实现这一目标。但是作为1.2 does not supports yet the import/export syntax:

Note, The ES2015 module syntax (import/export) is not supported yet in Meteor 1.2.

如果你想早些开始使用这些功能,我建议使用this package这是一个临时解决方案来填补当前的导入/导出差距,流星团队开发目前正在寻找一个优雅的解决方案来支持这个