2015-09-25 27 views
-1

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

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

编辑:任何有兴趣,这正是我一直在寻找:

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

回答

1

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

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

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

api.export('MyNamespace'); 
+0

在OP的特定情况下,这可能是我认为他的WebRTC代码将用作典型模块的最佳方式。 但是,如果只需要命名空间的一小部分,如说一个论坛的职位功能,然后制作一个包可能是矫枉过正,如果不是该混淆。制作一个名为forum的软件包会更有意义,然后在软件包内部具有“package-private”/“internal”/“protected”(你想要调用它们的对象)对象。 –

1

您可以使用具有全局对象和对象内部的功能的通用模式。

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

然后你就可以把它叫做模板助手里面:

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

拿笔记文件的流星加载顺序的,下的lib文件夹里的任何东西首先被加载。如果遇到未定义“Greetings”对象的问题,那么因为该文件尚未加载。您可以重复使用相同的模式在不同文件中添加更多功能(您可以使用App = App || {},但它会在Chrome中引发错误)。

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

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

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

这正是我在找的,谢谢你! – maxencecornet

+0

你也可以在一个包内部做到这一点,以保持组织和导出它,这是创建一个包的Facebook API和导出FacebookAPI的API我为帮助者/杂项功能等:)这是很好的模式。 –

+0

这是正确的,实际上,对于整个“模块”的功能id推荐。但对于“应用”全球对象,我不认为这是一个好主意。 –

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这是一个临时的解决方案,以填补目前的导入/导出差距,流星团队发展正在寻找一个优雅的解决方案来支持。