如何在初始功能之外以适当的 AMD 方式使用自定义 Dojo 模块
How can I use custom Dojo modules in the proper AMD way outside the initial function?
我终于明白了,为什么命名类不是一个好的做法,我想更新我的代码。但是,即使在阅读了几个文档页面、博客条目和 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() 的信息。
因此,即使我不确定的技术细节仍然很少,但现在我理解了基本思想,我知道下一步要寻找什么。其余的应该很容易。我可能会在以后更新以进一步改进此答案以帮助解决相同问题的其他人,但我现在很高兴:-)
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- 让Webpack管理Quirky AMD定义的最佳方式
- 如何使文本、数字和日期html输入字段以一致的方式支持Ctrl+Z(撤消)
- 修改 HTML 的方式使左键应带到下一个 URL
- 如何设计API,使其符合REST约定和Ember.js方式
- 如何在初始功能之外以适当的 AMD 方式使用自定义 Dojo 模块
- 如何在不重新启动 Web 应用程序的情况下以编程方式使 JavaScript 和 CSS 包失效或刷新
- 使 requirejs 模块符合 AMD 标准
- ImageMapster插件:如何以编程方式使区域不再可选
- 使网页实时和多用户的最佳方式
- 如何使JavaScript在这种情况下以更明显的方式失败
- 如何使输入以内联方式显示
- 如何将两个段落连接在一起以内联方式显示,而不会使文本移动
- 使window.rollTo()以物理方式滚动到某个点
- 如何使这个Javascript以不同的方式出现
- 当与require.js一起作为AMD模块使用时,覆盖underscore.js默认值
- 干净的方式使后续AJAX调用基于数据的API
- 如何以编程方式使浏览器缓存无效
- 纯CSS方式使按钮有两个点击状态
- 以编程方式使用时,Babelify sourceType错误