英文地址:http://dojotoolkit.org/reference-guide/1.10/dijit/_WidgetBase.html

介绍

dijit/_WidgetBase是Dijit包中所有组件的基类,也是Dojo中所有组件的一个基类。通常一个组件也会继承一些属性融合的工具类,例如:dijit._TemplatedMixin

注意:_WidgetBase名字中的下划线表示它是一个基类,不可直接使用,而不是表示它是一个私有的类。

用法

Dojo中所有的组件通过调用dojo.declare()继承_WidgetBase:

dojo.declare("MyWidget", dijit._WidgetBase, { ... });

然后根据组件的生命周期定义大量的方法。

生命周期

组件的生命周期就是用来描述组件从创建到销毁的中间过程,以及阐述每个阶段完成的内容。无论你通过dojo/method或者是重新定义构造函数实现新的组件,生命周期中的一些方法都可以作为你自定义组件的一个切入点,重新实现自己的组件。

组件都是通过dojo.declare()创建的一个类。所有的组件都需要继承dijit._WidgetBase,并且绝大多数组件还需要获取模板融合类(_Templated mixin),它可以帮助你扩展或重写父类相关的方法:

  • constructor(构造方法)

在根据传入参数初始化组件之前,构造方法就会被调用。所以说,在构造方法中你可以进行数组初始化等操作。

  • parameters are mixed into the widget instance(读取组件属性)

这个过程是将你通过HTML标签设定的组件属性(例如<button iconClass=...>)或者通过构造方法传入的属性(例如:new dijit.form.Button({label: “hi”}))应用到组件上。这个过程是不可重写的。

  • postMixInProperties(混淆属性)

如果你重写了postMixInProperties方法,它会组件渲染之前以及DOM节点创建之前被调用,如果你需要增加或者修改组件对象的属性,这里就是处理时机。

API中描述:这个方法在组件的参数读取之后,但是组件模板实例化之前会被调用,这个对于有组件模板引用的组件十分适用。

  • buildRendering(渲染组件)

dijit._TemplatedMixin提供buildRendering实现你想要实现的组件。此方法执行后,模板会被加载、节点会被创建、事件也会被绑定,最终的结果就是完成节点的展示。如果你没有混入类dijit._TemplateMinxin(通常OOTB dijit会去做),而且希望自己去渲染组件(例如:简化一个组件,或者更换系统模板),你就可以在这个方法中实现。

API中描述:构造组件的UI,并应用到this.domNode。大多数需要重写这个方法的组件都需要继承类dijit._TemplateMinxin。

  • setters are called(执行setXXX方法)

类中定义的_setXXX方法会在此时被执行,不管在构造函数中或者为non-null non-blank non-zero类型数据设定默认值,这个方法都会执行。

  • postCreate(创建组件)

这个方法是一个组件创建成功的关键步骤,这个组件已经被渲染(注意:如果是容器,那么容器内的组件还未被渲染),并且此组件还未依附到一个DOM节点上,所以在这个方法中你不能进行任何布局相关的计算

API描述:在组件片创建之后执行,但是不一定已经添加到HTML文档中(通过placeAt()指定依附节点),这个方法不包括管理大小和位置的任何计算。

  • startup

如果你确认所有的子组件已经完成解析、创建,你就可以调用startup()方法。这个方法通常用于布局相关的的组件,例如:BorderContainer。如果组件需要通过JS进行布局计算,那么就可以在startup()中调用resize()方法进行布局处理。

API描述:在组件片已经添加到文档之后执行,并且所有相关的组件已经执行完postCreate()方法。注意:startup()方法可能在组件隐藏的时候被调用,例如:一个隐藏状态的对话框dijit/Dialog,或者一个隐藏状态的Tab页dijit/layout/TabContainer,对于这些组件,如果你想重新布局,最好将相关代码放到resize()方法中,并且继承dijit/layout/_LayoutWidget,当组件显示的时候,resize()方法就会被调用。

  • destroy

此方法可以进行数据销毁,一般父类都会自动的调用此方法销毁对象。销毁对象的方法:

var widget = new dijit.form.TextBox({name: "firstname"}, "inputId");
widget.destroy();
dijit.byId("dijitId").destroy();

其他方法

  • resize

所有需要通过JS设定大小的组件都有一个叫resize()的方法,它用来重新设定组件的大小。它在执行startup()方法中被调用,或者被父组件调用,例如:dijit.layout.ContentPane

  • this.inherited()

当你继承一个类,并且重写它的方法是,父类可能进行有一些重要的处理。那么就可以通过执行这个方法形成一个继承链,会去执行父类的方法。这个方法在开始你的自定义处理前要被调用,例如:

postCreate: function(){
// do my stuff, then...
this.inherited(arguments);
}
var A = declare(null, {
m1: function(){
console.log("A.m1");
},
m2: function(){
console.log("A.m2");
}
});
var B = declare(A, {
m1: function(){
this.inherited(arguments);
console.log("B.m1");
}
});
B.extend({
m2: function(){
this.inherited(arguments);
console.log("B.m2");
}
});
var x = new B();
dojo.safeMixin(x, {
m1: function(){
this.inherited(arguments);
console.log("X.m1");
},
m2: function(){
this.inherited(arguments);
console.log("X.m2");
}
});
x.m2();
// prints:
// A.m1
// B.m1
// X.m1

属性

或许_WidgetBase最重要的特点就是在组件初始化的时候有自动初始化属性值得能力,或者在组件的整个生命周期中修改属性的值。_WidgetBase通过实现set()方法来做到这一点,例如:为日期输入框设定日期值:

myDateTextBox.set('value', new Date())

同样,也会有一个get方法用来获取属性值,例如:获取TitlePane是打开还是关闭,可通过:

myTitlePane.get('open')

还提供watch()方法来监控属性值的变化:

myTitlePane.watch("open", function(attr, oldVal, newVal){
console.log("pane is now " + (newVal ? "opened" : "closed"));
})

自定义setters/getters

get()/set()可以被用于自定义setters/getters,它可以用来将组建的属性与DOMNode节点属性形成对应关系,或者用来执行额外的操作。可以参考Writing Widgets QuickStart教程

参考

Writing Widgets

 

PS:初次翻译,如有问题欢迎交流。

dijit/_WidgetBase的更多相关文章

  1. Using dijit/Destroyable to build safe Components

    In today's long-lived JavaScript apps it is essential to not introduce memory leaks within your cust ...

  2. 【原创】(AMD)JavaScript模块化开发(dojo)

    AMD原理等在这里就不进行说明了,作者也是菜鸟一枚,只是对自己的一个实例进行说明,如有错误,望指出. 首先,先推荐一篇AMD方面的文章,有兴趣的可以参考:http://efe.baidu.com/bl ...

  3. AMD模块介绍(翻译)

    http://dojotoolkit.org/documentation/tutorials/1.10/modules/index.html Dojo支持以异步模型定义(AMD)方式编写的模块,让会让 ...

  4. 《静静的dojo》 总体教程介绍

    web2.0时代,ajax技术成为整个前端开发领域的基石.大部分的书籍.博客由此切入来介绍前端类库与框架,所以dojo往往只被当做一个ajax类库来介绍,然而仅仅以此来定位dojo,无异于管中窥豹.对 ...

  5. ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测

    一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不 ...

  6. dojo新建widget步骤----主要针对widget路径

    一,新建目录 二,新建文件 三,写urtil widget代码 四,写RedTextDialog代码 五,写HTML代码 =====================如有不懂,结合http://blog ...

  7. dojo自定义Widget

    使dojo AMD规范进行widget 定义,开始的时候一直找不到自己定义的widget模块的位置,经过探索,总算有收获,我这个人有毛病,脑子里不允许有一些想不通的问题,一旦有了问题,就非常难受,心里 ...

  8. Dojo Widget系统(转)

    Dojo 里所有的小部件(Widget)都会直接或间接的继承 dijit._Widget / dijit._WidgetBase dijit._Widget 是 dojo 1.6 和 1.6之前的版本 ...

  9. dojo的TabContainer添加ContentPane假设closable,怎么不闭幕后予以销毁ContentPane

    其主要思想是新的TabContainer的扩展类,重载其closeChild属性,使得其在关闭子容器时.不调用该子容器的destroyRecursive方法. define([ "dojo/ ...

随机推荐

  1. session购物车中的移除功能部分(学生笔记)

    function onclick_remove(r) { if (confirm("确认删除么!此操作不可恢复")) { var out_momey = $(".out_ ...

  2. 【H5最强攻略】百度人脸情绪实时识别

    最近看的各位大佬都在体验百度大脑2019年全新上线的24项AI能力! (我也按耐不住了,赶紧走一波- 哈哈) 接下来要介绍的就是H5端的人脸检测攻略. 附带详细的介绍,代码,以及演示体验等 欢迎提出各 ...

  3. 利用Flask中的werkzeug.security模块加密

    1.这种加密方式的原理:加密时混入一段"随机"字符串(盐值)再进行哈希加密.即使 密码相同,如果盐值不同,那么哈希值也是不一样的.现在网站开发中主要是运 用这种加密方法. 2.这个 ...

  4. Linux:源代码安装及脚本安装的使用

    由于这两个安装方法比较少,就没有单独分开来写 源代码安装 源码安装的步骤 (1)对下载的码包进行解压 (2)进入解压目录执行 configure 命令做相关设置 (3)执行 make 进行编译 (4) ...

  5. 009.MongoDB分片群集部署

    一 前期准备 1.1 组件说明 MongoDB分片群集包含以下组件: shard:每个分片是分片数据的子集.从MongoDB 3.6开始,必须将分片部署为副本集. mongos:mongos充当查询路 ...

  6. 简述FreeCAD在vs2017下的编译与dxf导入

    最近发现 FreeCAD 官方在发布 0.19_pre 时已提供 vs2017 x64的LibPack,现在就再来测试一下. 编译 下载 FreeCADLibs_12.1.2_x64_VC15.7z ...

  7. FFT/NTT初探

    做了全家桶然后写了几道入门题. FFT.ref NTT.ref Luogu4238 [模板]多项式求逆 Link 套牛顿迭代完事.有一个细节问题是:这次运算多项式有几项就只赋几项的值,其他位置(次数大 ...

  8. WindowsOS下Nginx+PHP环境配置

    Nginx 配置虚拟主机 在conf目录中的nginx.conf中最后一行前面加上 include vhost/*.conf; 在conf目录中添加一个文件夹vhost(此文件夹用来保存Nginx虚拟 ...

  9. Redis思维导图

    Redis基本数据结构 1.String 1.1 数据结构 long len byte数组长度 long free 可用数组长度 char buff[] 数据内容 1.2 命令 键值:设置值通过字符串 ...

  10. numpy中多维数组的绝对索引

    这涉及到吧多维数组映射为一维数组. 对于3维数组,有公式: def MAP(x,y,z): return y_s * z_s * x + z_s * y + z 此公式可以推广到N维 测试代码:(两个 ...