我终于理解了that and why named classes are not a good practice,我想更新我的代码。但是,即使在reading several documentation pages之后,blog entries and SO questions ,当我需要在需要模块的功能之外使用模块时,我不明白如何以正确的AMD方式做这件事。 AMD支持这个,还是我应该完全支持重新排列我使用AMD类的文件?
我之前做过的事 - 配置:
var dojoConfig = {
paths: {
fooBar: '@Url.Content("/portal/Modules/Foo.Bar/Scripts/foo-bar")'
}
};
在模块中:
define("fooBar/foo", [/*required modules*/], function(/*required modules*/) {
//the rest of code
return declare("fooBar.foo", [/*superclass*/], {
//the rest of code
在我使用它的文件中:
var required = [
/*first 5 required modules*/
"fooBar/foo",
/*the rest of required modules*/
]
require(required, function (/*5 first modules*/, Foo) {
//code
var barBaz = _customFunction(/*parameters*/);
//code
});
//Foo and other names set by require are not available here
function _customFunction(/*parameters*/) {
//code
var foo = new fooBar/foo({/*parameters*/});
//code
}
我从课程中删除了模块名称,我不能再看到它了。即使fooBar
未定义,除非我需要来自同一名称空间的命名函数bar
。我在配置中添加了async: true
,但没有任何改变。我理解AMD类构造函数不应该包含在需要模块的函数中(不要问我源代码,上面链接的某个地方),但是如何创建类的对象?
什么应该是另一个要求的召唤,但我不确定如何使用它。什么,我不确定这是否被认为是一种好的做法 - 做一些肮脏的解决方法会打破转向未命名声明的重点。
将所有内容放入包装函数中,或者可能放入类中,其中没有代码位于require语句的范围之外。在我的例子中,我将函数_customFunction
移动到一个带有空构造函数的命名类,以避免包装并可能破坏驻留在同一文件中的数十个函数;一旦我们有时间,我们也将改造其他人......并确保我们真正改进了代码。
所以,这条鱼被抓住了,但是我仍然在这个钓鱼课中途停留了一半。
TL; DR:我需要了解什么是好的做法以及什么是不太好的做法,但仍然有效(以及为什么)用于转录位于名称范围之外的类构造函数调用由require语句设置。
答案 0 :(得分:0)
在向我提出这个问题contains the right advice之前我还没看过的看似唯一的Dojo教程!
关键部分:
再次,在我之后重复“全局命名空间是坏的,全球的 命名空间不好,我不会使用全局命名空间,我不会用 全局命名空间“。
将其包装在require
语句中。
在require()的闭包内,我们引用了基于的模块 我们在参数中声明的变量名。
这可能在declare
之内,但没有必要。
AMD中的另一个核心功能是通常用于的define() 定义模块。有关更多信息,请参阅定义模块教程 有关如何使用define()的信息。
所以即使我不确定的技术细节还很少,现在我理解了基本的想法,我知道下一步要找什么。其余的应该很容易。我可能会更新以改善这个答案,以帮助其他人解决同样的问题,但我现在很高兴: - )