当前位置 : 主页 > 网页制作 > Dojo >

dojo 模块之define

来源:互联网 收集:自由互联 发布时间:2021-06-15
Dojo中的模块,最直接的理解就是 Java 里的 Class ,只有语法的区别,概念是一样的 。 dojo.define () 使用 define 来定义一个模块,参数介绍如下: define(自己模块名可选,依赖模块数组可以

Dojo中的模块,最直接的理解就是 Java 里的 Class ,只有语法的区别,概念是一样的

dojo.define () 

使用 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();
}); 

dojo.declare () 

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, OtherClass, and ThatClass
 
});

  

define()和declare () 结合使用 

 

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([ "myModule" ], function(myDeclare){
    // 这里引入dojo的xmlHttpRequest模块
    require(["dojo/_base/xhr"],function(xhr){
       xhr.post();
    });
    // 这里调用我们自定义的模块
    myDeclare.hello();
});

  

require是异步执行的,所以如果你这样写会报错的

 
var myVar;
require([ "myModule" ], function(myDeclare){
    myVar = new myDeclare();
});
myVar.hello();
  因为,require是异步执行的,在执行到myVar.hello();这句时,myModule模块还可能正在被加载——是否加载完毕由你的模块缓冲状态决定

  

(Via @glue)

网友评论