我有一套通用功能,我在通用命名空间(js Global)下设置了这些功能。
一.e.
// utils/utils.js
Utils = {};
然后在子文件夹中:
// utils/validation/validation.js
Utils.Validation = {};
// utils/validation/creditCard.js
Utils.Validation.creditCard = ... // validation logic etc
我还有一堆代码 使用Utils 和它的子对象。
显然,这一结构在Meteor首先装载子文件夹时不起作用。
为了让它如预期的那样发挥作用,我不得不创建无意义名称的/子文件夹/子文件夹/子文件夹/子文件夹,然后在最深的子文件夹中插入根对象,在子文件夹中插入分支对象,而分支对象则不那么深。
这对我的品味和差错易感(假设你有在文件夹结构中更深层的成分)来说是极为反直观的。
为了解决这个问题,我利用Q图书馆延期并承诺。 解决方案仍然不干净,因为它使您常规代码重复和检查,但它能让您完全控制负荷订单,而不会干扰目录结构(向那些说您可以随意组织流星代码的人致以问候 ) 。
示例:
//utils.js
UtilsDefer = UtilsDefer || Q.defer();
UtilsDefer.resolve({
// here some root utils stuff
});
//cards.js
// here we ll depend on Utils but don t want to care about directory structure
UtilsDefer = UtilsDefer || Q.defer(); // it will be a) already
// resolved defer from utils.js, or b) new defer that will
// be resolved later in utils.js
UtilsDefer.then(function(Utils) {
// do something with utils usage, or for instance add some fields here
Utils.CreditCardDefer = Utils.CreditCardDefer || Q.defer();
Utils.CreditCardDefer.resolve({
// Credit card utils here
})
});
//someOtherFile.js
// it will be pain to use sub-objects with this method though:
UtilsDefer = UtilsDefer || Q.defer();
UtilsDefer.then(function(Utils) {
Utils.CreditCardDefer = Utils.CreditCardDefer || Q.defer();
Utils.CreditCardDefer.then(function(CreditCard) {
// do stuff with CreditCard _if_ you need to do it on startup stage
})
});
这是相当狭义使用案例的例子, 因为大多数情况下, 您会乐于在某些用户互动回调或 Meteor. startup
中处理这些全局。 否则, 如果您想要在很早的阶段精细控制初始化命令, 这可能是个解决方案 。