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

How can I use custom Dojo modules in the proper AMD way outside the initial function?

我终于明白了that and why named classes are not a good practice and I would like to update my code. However, even after reading several documentation pages, blog entries and SO questions,我不明白如何以正确的 AMD 方式当我需要在需要模块的函数之外使用模块时。 AMD 是否支持这个,或者我应该从我使用 AMD 的地方完全重新排列文件 class?

我之前做的 - 配置:

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
}

我从 class 中删除了模块名称,我再也看不到它了。即使 fooBar 也是未定义的,除非我需要来自同一命名空间的命名函数 bar 。我在配置中添加了 async: true,但没有任何改变。我知道 AMD class 构造函数不应该包含在需要模块的函数中(不要问我源代码,上面链接的某个地方),但是如何制作 class 的对象?

应该起作用的是 require 的另一个调用,但我不确定如何使用它。什么,我不确定这是否被认为是好的做法 - 做一些肮脏的解决方法会破坏移动到未命名声明的点。

有效的方法是将所有内容放入包装函数,或者可能放入 class,其中没有代码位于 require 语句的范围之外。在我的例子中,我将函数 _customFunction 移动到具有空构造函数的命名 class 以避免包装并可能破坏驻留在同一文件中的数十个函数;一旦我们有时间,我们也会改变其他人......并确保我们真的在改进代码。

所以,鱼钓上来了,但是这次钓鱼课我还是卡在了一半。

TL;DR: 我需要了解什么是好的做法,什么是不太好的做法但仍然有效(以及为什么)用于转录 class位于 require 语句设置的名称范围之外的构造函数调用。

在问这个问题之前我似乎唯一没有读过的 Dojo 教程 contains the right advice 给我!

关键部分:

Again, repeat after me "the global namespace is bad, the global namespace is bad, I will not use the global namespace, I will not use the global namespace".

所以将其包装在 require 语句中。

Within the closure of the require(), we reference the modules based on the variable name we declared in the argument.

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

The other core function in AMD is define() which is usually used for defining modules. See the Defining Modules tutorial for more information on how to use define().

因此,尽管还有一些我不确定的技术细节,但现在我了解了基本思想,并且知道下一步要寻找什么。剩下的应该很容易。我可能会在以后更新以改进这个答案,以帮助其他人解决同样的问题,但我现在很高兴:-)