我在转向使用Dojo和新的AMD结构时遇到了很多困难,真的希望有人能为整个概念提供一些启示。我过去几周一直在依靠Google寻找关于使用方式以外的信息,并探究使用这种结构和设计模式趋势的信息。
我觉得奇怪的是,对于一个相对复杂的javascript应用程序,例如需要创建和样式化Dijits、创建DOM元素等主页面,我需要引入并使用大量不同的模块,而这些模块在AMD系统之前都可在dojo命名空间中获得(或者至少没有分配给23个不同的变量)。
例如:
require(['dijit/form/ValidationTextBox', 'dijit/form/SimpleTextarea', 'dijit/form/CheckBox', 'dijit/Dialog', 'dijit/form/Form'])
require(['dojo/ready', 'dojo/parser', 'dojo/dom-style', 'dijit/registry', 'dojo/dom', 'dojo/_base/connect', 'dojo/dom-construct'],
function(ready, parser, style, registry, dom, event, construct){
//...etc
}
这只是我正在处理的页面中的一些模块。肯定有更好的、不会在未来版本中破坏的方法来访问这些方法,等等。我的意思是,难道我真的要导入一个全新的模块来使用byId()
吗?还需要另一个模块来连接事件吗?除此之外,为了保留参数列表中的变量名而创建的所有混乱看起来都像是回退。
我想也许当需要时只需require()
该模块,如query
模块,但如果我需要它超过一次,那么它被分配的变量很可能超出范围,我需要把它放在一个domReady!
或ready
调用中。真的好麻烦啊…!
这就是为什么我只能假设是我对Dojo缺乏理解。
我已经尽力查找并购买了书籍(尽管是一本AMD之前的书),但这个库确实让我费尽心思。我欢迎任何人能够帮我解决这个问题。
示例编辑
require(['dijit/form/ValidationTextBox'])
require(['dojo/ready', 'dojo/parser', 'dojo/dom-style', 'dijit/registry', 'dojo/dom', 'dojo/_base/connect', 'dojo/dom-construct'], function(ready, parser, style, registry, dom, event, construct){
/* perform some tasks */
var _name = new dijit.form.ValidationTextBox({
propercase : true,
tooltipPosition : ['above', 'after']
}, 'name')
/*
Let's say I want to use the query module in some places, i.e. here.
*/
require(['dojo/query', 'dojo/dom-attr'], function(query, attr){
query('#list li').forEach(function(li){
// do something with these
})
})
}
根据这种格式,它与许多来自道具工具包人员以及第三方网站的示例一起使用,我认为在第一个function(ready, parser, style, registy...
中加载所有必需的模块绝对是荒谬的,因为它会变得越来越长,并会创建命名冲突等问题。在脚本的生命周期内启动并
require()
所有需要的模块对我来说似乎很傻。话虽如此,我得看看一些“包管理器”脚本。但是对于这个示例,如果我想在选定的位置使用查询模块,则必须将其与其余内容一起加载到主require()
语句中。我在某种程度上理解为什么,但是通用点语法命名空间有什么问题?dojo.whatever?dijit.findIt()?为什么要加载模块、在独特名称中引用、通过闭包传递,等等?我希望这是一个更容易回答的问题,但我希望这讲得通。
沮丧
叫我新手吧,但这真的...真的...把我逼疯了。当涉及到Javascript时我不是新手(显然不是),但天哪。我真搞不懂!
这就是我所收集到的。在adder.js中:
define('adder', function(require, exports){
exports.addTen = function(x){
return x + 10
}
})
在某些母版页或其他页面:
require(['./js/cg/adder.js'])
虽然不太整洁,但无关紧要。现在重点是使用require(['cg/adder'])
格式。
然后,使用adder
应该是:
console.log(adder.addTen(100)) // 110
我最接近的结果是console.log(adder)
返回 3
。是的,3
。否则,就会返回adder未定义
。
为什么这个要这么难呢? 我在这个问题上犯了新手错误,因为我真的不知道为什么这些代码不能正确运行。
谢谢大家。
adder
)。 - Domenic