Dojo中的模块,最直接的理解就是 Java 里的 Class ,只有语法的区别,概念是一样的。
使用 define 来定义一个模块,参数介绍如下:
define(自己模块名<可选>,依赖模块数组<可以为空>,function(依序的依赖模块declare){ 这里需要return一个dojo.declare对象 });、
定义一个模块,假定我们的文件名为 myModule.js
- define(["dependentModuleOne","dependentModuleTwo"],function(declareModuleOne,declareModuleTwo){ // 这里必须return一个JSON对象
- var myModule = {}; myModule.hello = function(){ alert("hello"); }; return myModule; });
使用一个模块
- // require(["文件路径,不带扩展名","可以同时引入多个模块"],function(对前面引入模块的声明,要按照顺序){})
- require([ "myModule" ],function(myDeclare){
- myDeclare.hello();
- });
declare() 使用这个方法,可以声明一个Class,可以实现模块的继承和多继承,参数介绍如下:
declare("namespace.ClassName?",[ inheritanceModelOne,inheritanceModelTwo ],{ } );
- "namespace.ClassName?" :可选,不写则为匿名,dojo会自动分配一个名称;
- [ one,two ] : 这里是继承的对象,数组类型,可继承多个;
- { } : 使用 JSON 来描述你的属性和方法;
示例代码一,声明一个类
- // Create a new class named "mynamespace.MyClass"
- declare("mynamespace.MyClass",null,{
- // Custom properties and methods here
- });
- // 使用这个类
- var myClass = new mynamespace.MyClass();
示例代码二,匿名类
- // Create a scoped,anonymous class
- var MyClass = declare(null,{
- // Custom properties and methods here
- });
示例代码三,继承
- 这里先写基类:
- var MyClass = declare(null,{
- // Custom properties and methods here
- });
- // 然后派生类
- var MySubClass = declare(MyClass,{
- // MySubClass now has all of MyClass's properties and methods
- // These properties and methods override parent's
- });
示例代码四,多继承
- var MyClass = declare(null,{
- // Custom properties and methods here
- });
- var OtherClass = declare(null,{
- // Custom properties and methods here
- });
- var ThatClass = declare(null,{
- // Custom properties and methods here
- });
- var MyMultiSubClass = declare([
- MyClass,OtherClass,ThatClass
- ],{
- // MyMultiSubClass now has all of the properties and methods from:
- // MyClass,and ThatClass
- });
- define([
- "dojo/_base/declare","dijit/form/Button"
- ],function(declare,Button){
- return declare("mynamespace.Button",Button,{
- label: "My Button",onClick: function(evt){
- console.log("I was clicked!");
- this.inherited(arguments);
- }
- });
- });
require()
require也可以嵌套使用
require是异步执行的,所以如果你这样写会报错的
- var myVar;
- require([ "myModule" ],function(myDeclare){
- myVar = new myDeclare();
- });
- myVar.hello();
因为,require是异步执行的,在执行到myVar.hello();这句时,myModule模块还可能正在被加载——是否加载完毕由你的模块缓冲状态决定
。
(Via @glue)