- 浏览: 688398 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
di1984HIT:
学习了,学习了!
Tomcat的URL中文乱码解决以及传输优化 -
arottenapple:
...
我的二十一天CoreJava 学习笔记 -
黯淡流觞:
...
我的二十一天CoreJava 学习笔记 -
onlyOneToOne:
wsc830719 写道@RequestMapping(val ...
spring mvc3中 ResponseBody中文乱码 -
waj_615:
但是打印订单不是简单的string 啊
用java实现打印功能
原文地址:http://dojotoolkit.org/documentation/tutorials/1.7/modules/
dojo现在支持在异步模块异步(AMD)定义中加入模块写入功能了,这使得代码更容易编写和调试。在这一节中,我们学习关于这个模块的使用,并探讨如何使用它。
概述
异步模块定义(AMD)格式是一种新的模块格式,只使用于1.7版本以上。它取代了dojo.provide, dojo.require, dojo.requireIf, dojo.requireAfterIf, dojo.platformRequire, and dojo.requireLocalization的这种写法。它提供了在模块的风格上许多的dojo改进,包括充分的异步操作,真正的包装可移植性,更好的依赖性管理和改善调试支持。它也是一个社区驱动的标准,这意味着模块写入的这种风格可用于任何其他适合AMD装载的模块。我们将给你演示怎样使用这个新的格式,以及强调一些对于旧风格新特性的优势。
介绍异步模块的定义
在讨论加载模块之前,我们先简单的介绍下模块是如何定义的。
如果你以前使用过dojo的1.6版本或更早的版本,你首先会发现最大的不同的地方是,新的模块定义看起来更像是文件的路径了。例如:以前的dojox.encoding.crypto.Blowfish 现在将写成dojox/encoding/crypto/Blowfish. 新的定义使你用起来更像是要处理文件路径。你可以使用"./"和"../"来相对引入在同一包下的其它模块。你甚至可以使用url来代替模块定义来加载模块。
在介绍完新特性后,现在我们就开始我们的教程了。
配置加载器
我们的dojo整体文件夹结构应该是和下面的一样
/ index.html js/ lib/ dojo/ dijit/ dojox/ my/ util/
第一步要做的就是设置加载为异步加载,也就是设置async属性为true
<script data-dojo-config="async: true" src="js/lib/dojo/dojo.js"></script>
async的设置也可以是在dofoConfig对象里设置,但不管怎么做,这个设置必须是在加载dojo之前设置。如果这个被忽略了,他就会使用同步操作。
在异步的模式下,加载器只定义了两种函数。
request 用于加载模块
define 用于定义模块
这里就是与传统的加载器有一个鲜明的对比。以前是加载所有模块。现在是并不是那么做了。
下一步就是来配置我们要加载的模块了
var dojoConfig = { baseUrl: "/js/", tlmSiblingOfDojo: false, packages: [ { name: "dojo", location: "lib/dojo" }, { name: "dijit", location: "lib/dijit" }, { name: "dojox", location: "lib/dojox" }, { name: "my", location: "my", main: "app" } ] };
在这个配置中,baseUrl被设定为本地目录,目录中包含了我们所有的JavaScript代码,tlmSiblingOfDojo被设定为false,避免混淆不清的行为习惯导致模块包装路径异常。最后是定义包列表,这里util没有被加到包里,虽然也访问util但使用器时对于加载的文件请求解析会有不同。
Packages
一般来说,包只是模块的集合。dojo,dijit,dojox都是包的实例。然而,不同的目录中的模块的简单集合,包还包含了一些额外的功能,这些功能显着增强了模块的可移植性和易于使用。
包有三个主要的配置选项。
name,是包的名字。
location 是包的位置,可以是相对路径的baseURL或绝对路径。
main 是一个可选参数,默认为“main”,如果有人试图要求加载模块,它可以用来发现加载正确的模块文件。例如,如果你尝试要求“dojo”,将装载的是实际的文件"/js/dojo/main.js"。既然我们已经为“我”包重写此属性,如果有人需要“my”,他们将载入“"/js/my/app.js"的。如果我们试图要求加载“util”,这是没有定义的包,装载机会尝试加载"/js/util.js".。
现在,我们已经正确配置加载器,让我们学习如何使用它,先来看require
Requiring 模块
最好的解释就是例子
require([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin" ], function(declare, _WidgetBase, _TemplatedMixin){ // "declare" holds the dojo declare function // "_WidgetBase" holds the dijit _WidgetBase constructor // "_TemplatedMixin" holds the dijit _TemplatedMixin constructor // Do whatever you want with these modules here. });正如你可以看到,require 功能需要两个参数。第一个参数是“依赖关系”的一个集合,第二个参数是一个回调函数。通过列出的顺序解决了模块的依赖。一旦解决了所有的依赖,他们就会传递给回调函数。回调函数是可选的,所以如果你没有做任何功能。只是要加载一些模块,你可以简单地忽略它。如果忽略依赖关系则意为着是另一种操作方案,所以一定要保证有一个依赖在里面,即使它是空的。
require({ baseUrl: "/js/", packages: [ { name: "dojo", location: "//ajax.googleapis.com/ajax/libs/dojo/1.7.1/" }, { name: "my", location: "my" } ] }, [ "my/app" ]);
// in "my/_TemplatedWidget.js" define([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin" ], function(declare, _WidgetBase, _TemplatedMixin){ return declare([ _WidgetBase, _TemplatedMixin ], {}); });上面的例子,我们通过dojo.declare创建和返回模块。定义模块时要注意的一件重要的事情是,回调函数只调用一次返回值并由装载器缓存。在实践层面,这意味着模块可以很容易地共享对象。
dojo.provide("my._TemplatedWidget"); dojo.require("dijit._WidgetBase"); dojo.require("dijit._TemplatedMixin"); dojo.declare("my._TemplatedWidget", [ dijit._WidgetBase, dijit._TemplatedMixin ], {});
// in "my/nls/common.js" define({ greeting: "Hello!", howAreYou: "How are you?" });
var map16 = { dojo: "dojo16", dijit: "dijit16", dojox: "dojox16" }, dojoConfig = { packages: [ { name: "dojo16", location: "lib/dojo16", packageMap: map16 }, { name: "dijit16", location: "lib/dijit16", packageMap: map16 }, { name: "dojox16", location: "lib/dojox16", packageMap: map16 }, { name: "my16", location: "my16", packageMap: map16 }, { name: "dojo", location: "lib/dojo" }, { name: "dijit", location: "lib/dijit" }, { name: "dojox", location: "lib/dojox" }, { name: "my", location: "my" } ] };在上面的配置中,任何时候使用map16来引用dojo,dijit,或dojox,他们将重定向到dojo16,dijit16,dojox16,而所有其他的代码将继续正常使用的软件包。
var dojoConfig = { paths: { "my/debugger/engine": "my/debugger/realEngine", "my/debugger": "other/debugger" } };鉴于此路径的配置,下面是路径解析的替换:
var dojoConfig = { aliases: [ [ "text", "dojo/text" ], [ "dojo/text", "my/text" ], [ "i18n", "dojo/i18n" ], [ /.*\/env$/, "my/env" ] ] };
// in "my/foo/blah.js" define([ "my/otherModule", "my/foo/bar" ], function(otherModule, bar){ // … });
// in "my/foo/blah.js" define([ "../otherModule", "./bar" ], function(otherModule, bar){ // … });
// in "my/debug.js" define([ "dojo/dom", "dojo/dom-construct", "dojo/on" ], function(dom, domConstruct, on){ on(dom.byId("debugButton"), "click", function(evt){ require([ "my/debug/console" ], function(console){ domConstruct.place(console, document.body); }); }); });
// in "my/debug.js" define([ "dojo/dom", "dojo/dom-construct", "dojo/on", "require" ], function(dom, domConstruct, on, require){ on(dom.byId("debugButton"), "click", function(evt){ require([ "./debug/console" ], function(console){ domConstruct.place(console, document.body); }); }); });
// in "my/Dialog.js" define([ "dojo/_base/declare", "dijit/Dialog", "dojo/text!./templates/Dialog.html" ], function(declare, Dialog, template){ return declare(Dialog, { templateString: template // template contains the content of the file "my/templates/Dialog.html" }); });
dojo.provide("my.Dialog"); dojo.require("dijit.Dialog"); dojo.declare("my.Dialog", dijit.Dialog, { templateString: dojo.cache("my", "templates/Dialog.html") });
// in "my/Dialog.js" define([ "dojo/_base/declare", "dijit/Dialog", "dojo/i18n!./nls/common"], function(declare, Dialog, i18n){ return declare(Dialog, { title: i18n.dialogTitle }); });
dojo.provide("my.Dialog"); dojo.require("dijit.Dialog"); dojo.requireLocalization("my", "common"); dojo.declare("my.Dialog", dijit.Dialog, { title: dojo.i18n.getLocalization("my", "common").dialogTitle });
// in "my/events.js" define([ "dojo/dom", "dojo/has!dom-addeventlistener?./events/w3c:./events/ie" ], function(dom, events){ // events is "my/events/w3c" if the "dom-addeventlistener" test was true, "my/events/ie" otherwise events.addEvent(dom.byId("foo"), "click", function(evt){ console.log("Foo clicked!"); }); });
dojo.requireIf(window.addEventListener, "my.events.w3c"); dojo.requireIf(!window.addEventListener, "my.events.ie"); my.events.addEvent(dom.byId("foo"), "click", function(evt){ console.log("Foo clicked!"); });
// in my/loadRenderer.js define([ "dojo/load!./sniffRenderer" ], function (renderer) { // do something with renderer }); // in my/sniffRenderer.js define([], function () { // returns an array of module identifiers to load; // the first module listed is the one returned by dojo/load return [ sniffModuleIdOfRenderer() ]; });
var module = sniffModuleIdOfRenderer(); dojo.require(module); var renderer = dojo.getObject(module); // do something with renderer
// in "my/app.js" define(["dojo/dom", "dojo/domReady!", function(dom){ // This function does not execute until the DOM is ready dom.byId("someElement"); });
dojo.ready(function(){ dojo.byId("someElement"); });
// in "my/a.js" define([ "b" ], function(b){ var a = {}; a.stuff = function(){ return b.useStuff ? "stuff" : "things"; }; return a; }); // in "my/b.js" define([ "a" ], function(a){ return { useStuff: true }; }); // in "my/circularDependency.js" require([ "a" ], function(a){ a.stuff(); // "things", not "stuff" });加载器在这种情况下,将尝试加载模块A,模块B,对于模块A和会发现两个模块是一个循环依赖。为了打破循环依赖,模块将被自动解析为一个空的对象。空对象将传递A的值到模块B,然后模块A的回调函数将被调用,其返回值被丢弃。在上面的例子中,这意味着将是一个空的对象,而不是一个功能的对象,所以我们的代码没有如预期般运作。
// in "my/a.js" define([ "b", "exports" ], function(b, exports){ exports.stuff = function(){ return b.useStuff ? "stuff" : "things"; }; return exports; }); // in "my/b.js" define([ "a" ], function(a){ return { useStuff: true }; }); // in "my/circularDependency.js" require([ "a" ], function(a){ a.stuff(); // "stuff" });
// in "my/legacyModule.js" dojo.provide("my.legacyModule"); my.legacyModule = { isLegacy: true };
# node.js: node path/to/dojo.js load=my/serverConfig load=my/app # rhino: java -jar rhino.jar path/to/dojo.js load=my/serverConfig load=my/app
<script data-dojo-config="async: true" src="path/to/dojo.js"></script> <script>require(["my/serverConfig", "my/app"]);</script>
发表评论
-
dojo封装dialog提示框
2012-06-20 10:20 5658/** * 显示dojo的弹出框.前提是已经引用了相 ... -
dojo封装表单ajax提交
2012-06-20 10:16 1715/** * dojo的ajax提交form(post ... -
封装创建dojo的dialog
2012-06-18 13:55 0/** * 显示dojo的弹出框.前提是已经引用了相 ... -
自定义封装dojo通用ajax提交表单
2012-06-18 13:52 2654/** * dojo的ajax提交form(post ... -
使用dojo的dialog自定义confirm效果
2012-06-18 13:43 5125/** * 使用dojo dialog模拟confi ... -
dojo 制做非模态窗口dialog
2012-06-16 13:27 4330dojo的dialog效果基本上都是模态的,也就是说,在弹出窗 ... -
dojo1.7的加载方法
2012-06-01 17:16 4266对于dojo1.7来说,最大的变化就是引入了AMD异步加载器。 ... -
不翻译DOJO了
2012-05-16 17:57 1104翻译DOJO的时间并不长。总是感觉把老外的话翻译过来很是生硬, ... -
dojo1.7翻译 数组工具(Arrays Made Easy)
2012-05-14 10:55 1973英文地址:http://dojotoolkit.org/ ... -
dojo1.7翻译 Dijit的主题,按钮和文本框(Dijit Themes, Buttons, and Textboxes)
2012-05-03 15:52 2215原文地址:http://dojotoolkit.org/ ... -
dojo1.7翻译 动画效果(Animations)
2012-05-02 12:08 2782原文地址:http://dojotoolk ... -
dojo1.7翻译 动态效果(Dojo Effects)
2012-04-27 10:15 1323原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 处理DOM(Dojo DOM Functions)
2012-04-26 15:51 2538原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 ajax跨域请求(Getting Jiggy with JSONP)
2012-04-25 12:02 3163原文地址:http://dojotoolk ... -
dojo1.7翻译 ajax功能(Ajax with Dojo)
2012-04-24 15:04 1567原文地址:http://dojotoolk ... -
dojo1.7翻译 搜索节点功能(Using dojo/query)
2012-04-23 15:32 1912原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 hello,dojo
2012-04-22 15:21 2165原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 定义类(Classy JavaScript with dojo/_base/declare)
2012-04-20 15:34 2563原文地址:http://dojotoolkit.org/doc ... -
dojo1.7翻译 通过dojoConfig来配置dojo
2012-04-18 09:20 5232原文地址:http://dojotoolk ... -
dojo1.7翻译 Hello,World
2012-04-17 10:17 1604原文地址:http://dojotoolkit.org/ref ...
相关推荐
Dojo 1.7 是一个重大的版本更新,其中引入了显著的改进和新特性,尤其是对模块加载机制的革新。这一版本的核心亮点是实现了Asynchronous Module Definition (AMD)机制,这是一项用于优化JavaScript模块加载的技术,...
Dojo 1.7 是 Dojo Toolkit 重要的版本更新,其中引入了显著的改进和新特性,尤其是对模块加载机制的革新。这一版本的主要焦点在于Asynchronous Module Definition (AMD),这是一种优化JavaScript代码组织和加载的...
Dojo 1.7 引入了AMD规范,这是JavaScript中的一种模块化加载机制,使得代码可以异步加载,从而提高页面的加载速度。通过`require`和`define`函数,开发者可以更好地组织和管理代码,实现模块间的依赖注入。 二、...
1. **模块化系统**:Dojo 1.7 引入了AMD(Asynchronous Module Definition)模块加载机制,这允许异步加载JavaScript模块,优化了页面性能,避免了整体加载导致的阻塞。通过`require`和`define`函数,开发者可以轻松...
Dojo 1.7 版本是其历史上的一个重要里程碑,引入了许多改进和优化,包括模块化系统AMD(Asynchronous Module Definition)以及对Dijit UI 框架的增强。 首先,我们来详细了解一下Dojo 的核心部分。Dojo 框架的核心...
Dojo 1.7 引入了异步模块定义(AMD)模式,通过`dojo.require`和`dojo.provide`实现了模块化的代码组织。AMD允许开发者按需加载依赖,减少了初始页面加载的时间,并提高了代码的可维护性。同时,`dojo/has`特性可以...
`require`和`define`是两个关键函数,`require`用于加载模块,`define`用于定义模块。 2. **dojo/_base**:这是Dojo的基础模块,包含了Dojo的基本功能,如对象创建、事件处理、DOM操作等。例如,`dojo/query`用于...
Dojo 1.7 引入了Asynchronous Module Definition(AMD),这是一种异步模块加载机制,允许开发者按需加载JavaScript模块,提高页面加载速度。通过`require`和`define`函数,开发者可以组织代码,使其更加模块化和可...
手册中列举了一些常用的Dojo包,如dojo.io用于不同类型的IO传输,dojo.dnd提供拖放功能的API,dojo.string提供了字符串处理方法,dojo.date帮助解析和操作日期,dojo.event处理事件驱动和AOP开发,dojo.back管理撤销...
在Dojo 1.7及以后的版本中,推荐使用`dojo/on`模块来处理事件。 7. **动画效果**:dojo的`dojo.fx`模块提供了创建复杂动画的能力,包括淡入淡出、滑动、缩放等效果。同时,`dojox.fx`提供了更多的特效和动画组合。 ...
此外,Dojo Toolkit提供了`dojo.declare`用于类的定义,支持面向对象编程。 Dojo中的Widget系统是另一个重要部分,它包含了大量的UI组件,如按钮、表单元素、日历等,方便开发者构建富客户端应用。这些组件基于dojo...
Dojo 1.7 引入了AMD,这是一种异步模块定义的加载机制,允许开发者按需加载模块,提高了页面性能。通过`require()`函数,我们可以方便地引入和依赖其他模块。 2. **Dijit UI 库:** Dijit是Dojo的UI组件库,包含...
Dojo 还提供了一种称为`define`的机制,用于定义模块。开发者可以创建自定义模块,指定其依赖,并提供一个返回值或初始化函数来定义模块的行为: ```javascript define(["dojo/_base/lang"], function(lang){ ...
2. **模块化系统(AMD)**:Dojo引入了异步模块定义(AMD)模式,使得JavaScript的模块化变得更为高效和灵活。通过require()和define()函数,可以方便地管理和加载模块。 3. **dojo/on事件处理**:dojo/on是Dojo...
这个"Dojo官方教程中文翻译完美版"为开发者提供了全面了解和掌握Dojo工具集的宝贵资源。 在Dojo框架中,有几个核心概念和关键组件是学习的重点: 1. **模块系统(AMD,Asynchronous Module Definition)**:Dojo是...
AMD通过`require`和`define`函数来实现模块的定义和依赖管理,使得代码结构清晰,易于维护。 Dojo Toolkit 包含了许多模块,如`dojo/_base`系列,它们提供了基础的JavaScript功能,如事件处理、对象创建等。`dojo/...
10. **dojo.on**: Dojo 1.7引入了`dojo/on`模块,它提供了更现代、更符合DOM Level 2事件接口的事件处理方式,同时兼容老版本的`dojo.connect`。 以上所述是Dojo 1.6在DOM操作方面的核心功能。通过这些API,开发者...
Dojo 是一个功能丰富的 JavaScript 库,它提供了一系列模块化、面向对象的工具,用于构建高性能的 Web 应用程序。在 Dojo 中,模块和包的概念是核心组成部分,它们帮助开发者组织和管理代码,使其更易于维护和重用。...
`dojo/store` API 是一个更现代的数据访问接口,适用于Dojo 1.7及以上版本,但1.2.1版本可能仍包含一些相关的实现。 8. **Dojo事件处理** Dojo 提供了一种统一的方式来处理DOM事件,如`dojo/on` 函数。它简化了...
1. **模块化**:Dojo使用了AMD(Asynchronous Module Definition)模块加载机制,允许开发者按需加载JavaScript模块,减少页面加载时间,提高性能。通过`require`和`define`函数,开发者可以组织代码,实现模块间的...