Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何管理Meteor中的命名空间?_Javascript_Meteor_Javascript Namespaces - Fatal编程技术网

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

Javascript 如何管理Meteor中的命名空间?,javascript,meteor,javascript-namespaces,Javascript,Meteor,Javascript Namespaces,这就是我的问题: 目前,我在一个模板js文件中有十几个与WEBRTC相关的函数。我的目标是将这些函数放在一个单独的文件中,例如称为webRTCWrapper.js,并在我的模板中调用这些函数,而不使用全局变量 我想我必须使用名称空间,对吗? 如果是,您如何使用它们 编辑:对于任何感兴趣的人来说,这正是我想要的: 您可以使用一种通用模式,即拥有一个全局对象以及该对象中的函数 Greetings = { hello: function(name) { return "Hello "+name+

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

我想我必须使用名称空间,对吗? 如果是,您如何使用它们

编辑:对于任何感兴趣的人来说,这正是我想要的:


您可以使用一种通用模式,即拥有一个全局对象以及该对象中的函数

Greetings = {
   hello: function(name) { return "Hello "+name+" how are you?"; }
}
然后可以在模板帮助程序中调用它:

Template.GreetingsTemplate.helpers({
   sayHello: function() { return Greetings.hello('Maxence'); }
})
注意Meteor中文件的加载顺序,lib文件夹中的任何内容都是先加载的。如果遇到未定义对象的问题,则其原因是该文件尚未加载

编辑: 您可以重复使用相同的模式在不同的文件中添加更多的函数。您可以使用App=App | |{},但它会在Chrome中抛出错误

App = (typeof App === 'undefined')? {} : App;
App.someFunction = function(){};
甚至,如果使用下划线.js:

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

从现在起,使用另一个文件中的代码的常规方法是通过全局服务器和客户端。正如Joao所建议的,您可以创建自己的全局应用程序变量,在其中存储或更一般地存储一个与Joao基本相同的解决方案,但需要解释

但随着ES2015支持的到来,我们很快就能有一个官方模式来实现这一点。但是作为1.2

如果您想更早地开始使用这些功能,我建议您使用这是一个临时解决方案来填补当前的导入/导出缺口,meteor团队开发人员目前正在寻找一个优雅的解决方案来支持这一点。

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

MyNamespace = {};
MyNamespace.myFunction = function () { };
api.export('MyNamespace');
然后,在package.js中,只需导出该名称空间

MyNamespace = {};
MyNamespace.myFunction = function () { };
api.export('MyNamespace');

这正是我想要的,谢谢!你也可以在一个包内这样做来保持组织和导出它,这与为facebook api创建一个包和为api导出FacebookApi是一样的,我为helpers/misc函数等做了这件事:这是一个好的模式。事实上,对于整个函数模块,我建议这样做。但是对于应用程序全局对象,我认为这不是一个好主意。在OP的特定情况下,这可能是最好的方法,因为我假设他的WebRTC代码将用作典型的模块。然而,如果只需要为项目的一小部分命名,比如说论坛的posts功能,那么制作一个包如果不是非常正确的话,那么可能是过火了。更合理的做法是创建一个名为forum的包,然后在包中设置包私有/内部/受保护的对象,您可以将它们称为包中的对象。