如何在初始函数之外以正确的AMD方式使用自定义Dojo模块?

时间:2016-03-08 12:08:57

标签: javascript class dojo amd

我终于理解了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语句设置。

1 个答案:

答案 0 :(得分:0)

在向我提出这个问题contains the right advice之前我还没看过的看似唯一的Dojo教程!

关键部分:

  

再次,在我之后重复“全局命名空间是坏的,全球的   命名空间不好,我不会使用全局命名空间,我不会用   全局命名空间“。

将其包装在require语句中。

  

在require()的闭包内,我们引用了基于的模块   我们在参数中声明的变量名。

这可能在declare之内,但没有必要。

  

AMD中的另一个核心功能是通常用于的define()   定义模块。有关更多信息,请参阅定义模块教程   有关如何使用define()的信息。

所以即使我不确定的技术细节还很少,现在我理解了基本的想法,我知道下一步要找什么。其余的应该很容易。我可能会更新以改善这个答案,以帮助其他人解决同样的问题,但我现在很高兴: - )