如何在初始功能之外以适当的 AMD 方式使用自定义 Dojo 模块

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

本文关键字:AMD 方式使 模块 Dojo 自定义 功能      更新时间:2023-09-26

我终于明白了,为什么命名类不是一个好的做法,我想更新我的代码。但是,即使在阅读了几个文档页面、博客条目和 SO 问题之后,当我需要在需要模块的功能之外使用模块时,我也不明白如何以正确的 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 语句设置的名称范围之外的类构造函数调用。

在问这个问题之前,我似乎唯一没有读过的 Dojo 教程包含了对我的正确建议!

关键部分:

再次,在我之后重复"全局命名空间不好,全局命名空间不好 命名空间不好,我不会使用全局命名空间,我不会使用 全局命名空间"。

所以把它包装在require语句中。

在 require() 的闭包中,我们基于 我们在参数中声明的变量名。

这可能在declare内,但不是必需的。

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

因此,即使我不确定的技术细节仍然很少,但现在我理解了基本思想,我知道下一步要寻找什么。其余的应该很容易。我可能会在以后更新以进一步改进此答案以帮助解决相同问题的其他人,但我现在很高兴:-)