你如何管理 Meteor 中的命名空间?
How do you manage namespace in Meteor?
所以这是我的问题:
目前,我在模板 js 文件中有十几个与 WEBRTC 相关的功能。我的 objective 是将这些函数放在一个单独的文件中,例如称为 webRTCWrapper.js,并在不使用全局变量的情况下在我的模板中调用这些函数。
我想我必须使用名称空间,对吗?
如果是这样,你如何使用它们?
编辑:对于任何感兴趣的人,这正是我要找的东西:
http://themeteorchef.com/snippets/using-the-module-pattern-with-meteor/
您可以使用具有全局对象和该对象内部的函数的通用模式。
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(){}
});
从现在开始,使用另一个文件中的代码的常规方法是通过全局(服务器和客户端)。正如 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 这是一个临时解决方案来填补目前的 import/export 差距,流星团队开发目前正在寻找一个优雅的支持这个的解决方案。
创建一个名为 packages/
的目录,使其与您的 .meteor/
目录平行。您可以创建一个导出单个 object/function 的包。在命令行中,使用 meteor create --package <yourpackagename>
和 meteor add <yourpackagename>
可以编辑 js 文件添加命名空间。
MyNamespace = {};
MyNamespace.myFunction = function () { };
然后,在 package.js 中,只需导出该命名空间。
api.export('MyNamespace');
所以这是我的问题: 目前,我在模板 js 文件中有十几个与 WEBRTC 相关的功能。我的 objective 是将这些函数放在一个单独的文件中,例如称为 webRTCWrapper.js,并在不使用全局变量的情况下在我的模板中调用这些函数。
我想我必须使用名称空间,对吗? 如果是这样,你如何使用它们?
编辑:对于任何感兴趣的人,这正是我要找的东西:
http://themeteorchef.com/snippets/using-the-module-pattern-with-meteor/
您可以使用具有全局对象和该对象内部的函数的通用模式。
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(){}
});
从现在开始,使用另一个文件中的代码的常规方法是通过全局(服务器和客户端)。正如 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 这是一个临时解决方案来填补目前的 import/export 差距,流星团队开发目前正在寻找一个优雅的支持这个的解决方案。
创建一个名为 packages/
的目录,使其与您的 .meteor/
目录平行。您可以创建一个导出单个 object/function 的包。在命令行中,使用 meteor create --package <yourpackagename>
和 meteor add <yourpackagename>
可以编辑 js 文件添加命名空间。
MyNamespace = {};
MyNamespace.myFunction = function () { };
然后,在 package.js 中,只需导出该命名空间。
api.export('MyNamespace');