我是一个Dojo的新手,但当我开始使用Dojo 1.7.2版本来开发新应用程序时,我也想使用新的AMD语法来编写函数。不幸的是,我好像无法理解它 :-(
最让我烦恼的是,我不能简单地调用任何在"require"块内部的函数。例如,我有一个页面,在打开时创建一个带有多个小部件的动态表格。然后我有一个按钮,每次按下时都会添加一行空白行。
如果没有AMD语法,那就很容易:
- 将所有的“dojo.require()”放在HEAD中
- 然后创建一堆自己的函数来创建表格和小部件
- 添加行函数可以轻松访问任何先前函数填充的全局变量
但是在AMD中就像这样:
初始函数创建表格和小部件:
function fillReportTable(repId) {
require(["dojo/dom-construct", "dojo/dom-attr", "dijit/form/FilteringSelect",
"dojo/data/ItemFileReadStore", "dijit/form/ComboBox", "dijit/form/DateTextBox", "dijit/form/Select", "dojo/store/Memory"],
function (domConstruct, domAttr, FilteringSelect, ItemFileReadStore, ComboBox, DateTextBox, Select, Memory) {
// a lot of code to create the table, consisting of SEVERAL functions
function createNewRow(tbl) { ...}
function function1 () {... }
function function2 () {... }
function function3 () {... }
}
现在,“添加空行”按钮调用了自己的函数“addEmptyRow”。
但是,在这个函数中,我必须:
- 再次为每个dojo模块执行另一个require
- 我不能使用任何在“fillReportTable”函数“内部”的函数。例如,“createNewRow”函数
function addEmptyRow() {
require(["dojo/dom-construct", "dojo/dom-attr", "dijit/form/FilteringSelect",
"dojo/data/ItemFileReadStore", "dijit/form/ComboBox", "dijit/form/DateTextBox", "dijit/form/Select", "dojo/store/Memory"],
function (domConstruct, domAttr, FilteringSelect, ItemFileReadStore, ComboBox, DateTextBox, Select, Memory) {
// a lot of code to create the table, consisting of SEVERAL functions
}
AMD 看起来似乎非常复杂。
或者我在这里漏掉了什么明显的东西?
使用 AMD,如果您将代码分解为许多小函数,您是否需要在每个函数内部再次进行“require”?还是将所有函数都放在一个具有完整列表的“require”中?
如果采用第二种方式,如何从小部件事件中调用这些函数?
fillReportTable: fillReportTable
会暴露fillReportTable()
函数吗? - joakimdahlstromrequire
时, AMD加载器将加载该模块的特定JS文件(在我们的情况下是“mymodules/mymodule.js”). 在那个JS文件中,您要将一个函数传递给define
,并且这个函数被用于"导出"该模块的功能性。在你的情况下,该模块代表了一个具有两个辅助函数的对象。 - Paul Grime