Dojo,Dijit基本内容总结

本文详细介绍了Dojo框架中的dojo.declare用于声明类的功能,强调了覆盖问题和多重继承的实现。同时,探讨了Dijit组件的生命周期,包括_dijit/_Widget基类的创建过程和销毁流程,强调了正确覆写生命周期方法的重要性。此外,文章还提及了Dijit组件的属性设置、事件处理和子组件管理,以及如何声明和实例化Dijit组件。
摘要由CSDN通过智能技术生成

dojo.declare

dojo.declare在dojo中被广泛使用,理解它将对弄懂dojo的代码有很大帮助。简单的说,dojo.declare提供了一种声明类的方式,通过它可以很方便的扩展其他类:

  dojo.declare("com.abc.MyDataProvider", dojo.widget.ComboBoxDataProvider,
  	{
  		name: "My DataProvider",
  		init: function() {
  			...
  		}
  	}
  );

这里类名com.abc.MyDataProvider是用字符串来表示的,dojo.widget.ComboBoxDataProvider是被扩展的基类,第三个参数是个object,用来定义该类的属性。 dojo.declare产生的类所具有的属性将是基类的属性和大括号中指定的属性的集合,如果大括号中声明了和基类同名的属性,则基类属性将被覆盖,但也有例外,下面将会说明。生成类的constructor将会调用基类的constructor,然后调用本身的initializer方法,该方法可以来类本身,也可以来自其基类,如果都没有还可以来自dojo.declare中可选的一个参数,否则将是个空函数。

如何使用产生的类呢?可以把该名字作为function类型的变量名来使用,如

  dp = new com.abc.MyDataProvider();

可见dojo.declare产生了一个指定名称的变量,引用创建出的class(function) 也可以:

  dpClass = dojo.evalObjPath("com.abc.MyDataProvider");
  dp = new dpClass();

这种方式比较适合通过类名字符串来使用该类。

1. 覆盖的问题

如果基类是这么声明的:

  dojo.widget.ComboxDataProvdier = function() {
  	this.init = function() {
  		...
  	}
  }

而我们希望com.abc.MyDataProvider里声明的init方法覆盖基类的方法,那么上面那个dojo.declare的结果是不对的,这时查看该类的一个实例,你会发现它的init属性是基类的方法。

dojo.declare先会把dojo.widget.ComboBoxDataProvider.prototype上的属性设置到com.abc.MyDataProvider.prototype上,然后再把本身声明的属性加进去,因此com.abc.MyDataProvider.prototype的init属性正是我们期望的init函数,但是当执行该类的constructor方法时,它会调用基类的constructor,因此本来设置好的init函数就被基类的init函数覆盖了,于是override失败。

这里的ComboDataProvider作为一个class,不应该在constructor里赋值init属性,这样会导致每个实例都会有一个init方法的实例,而这是没有必要的。应该用prototype来定义method属性:

  com.abc.MyDataProvider.prototype.init = function() {
  	...
  }

由此可见,用dojo.declare来override还是有个前提的,那就是要override的method必须用prototype定义,而不是在constructor里。

2. 多重继承

dojo.declare是可以扩展多个类的,如: dojo.declare("dojo.widget.html.ComboBox", dojo.widget.HtmlWidget,,

{ ... }

); 这时第一个类dojo.widget.HtmlWidget将会被作为super class,于是其prototype上的属性将会进入dojo.widget.html.ComboBox.prototype,然后其他基类prototype上的属性也会被mixin到dojo.widget.html.ComboBox.prototype,最后是类本身声明的属性。当然在constructor只会调用基类的construtor。

这有点类似java的单根继承、多个接口,不过要注意的是:如果dojo.widget.HtmlWidget和dojo.widget.ComboBox同时声明了一个函数属性,那么产生的类将会具有dojo.widget.ComboBox里声明的函数,这时如果dojo.widget.ComboBox因为是一个接口类而把该属性声明为空函数,而你希望继承的是dojo.widget.HtmlWidget上该方法的实现,那么结果就不对了,你得到的类的该方法将是dojo.widget.ComboBox上的声明的空函数

dijit 生命周期

来自文章
http://www.ibm.com/developerworks/cn/web/1009_chengfu_dijit/index.html

Dijit 组件(widget)是 Dojo 提供的图形用户界面组件库。它提供了 Ajax 应用开发中会用到的常用组件,可以帮助开发人员快速的构建 Ajax 应用。本文并不会介绍 Dojo 默认提供的组件,而是侧重于介绍 Dijit 组件的编程模型和最佳实践,其目的是帮助开发人员更好的开发自己的 Dijit 组件。下面首先对 Dijit 做概要介绍。

Dijit 概述

Dijit 组件的存在是 Dojo 框架区别于其它 JavaScript 框架的一个重要特性。在桌面应用开发中,开发人员大量使用图形用户界面组件库来提高开发效率。而在 Web 应用开发中,HTML 语言本身仅提供了少数基本的控件,如按钮、单选框、复选框、文本输入框和下拉列表等。而对于在 Web 应用开发中常见的一些复杂组件,如对话框、菜单、工具栏、进度条、富文本编辑器和树等,并没有提供原生的支持。在这种情况下,开发人员往往需要自己开发这样的复杂组件,这就造成了更长的开发周期和更高的开发和维护的成本。

Dojo 提供了一个种类多样的组件库。开发人员只需要简单的定制就可以在自己的应用中使用这些组件。除此之外,Dojo 还提供了完善的组件编程模型。如果默认提供的组件都不能满足需求,可以自己来开发所需的组件。遵循这个统一的编程模型,会比从头开始创建组件要容易得多。有了组件的概念之后,开发人员在设计 Web 应用的时候,就可以从比较高的抽象层次来对应用的各个部分进行划分。定义好清晰的组件接口之后,团队成员就可以各司其职,并行开发,从而提高开发效率。

在开发 Dijit 组件的时候,需要注意下面几个基本的问题。

  • 组件的粒度问题。一般来说,功能比较复杂的组件不利于复用,也不利于团队开发时的分工合作。但是过多小组件在页面上的时候,会消耗比较多的系统资源,影响性能。而性能对 Web 应用来说是一个非常重要的因素。因此需要进行一定的权衡。比较好的做法是从较大的组件开始,当发现存在代码重复的时候,再把重复的代码提取出来,重构成新的组件。这样就把划分成小组件的决策推迟到了真正需要的时候,避免过度设计。
  • 组件的接口问题。组件的接口定义了代码中的其它部分如何使用该组件。一般来说,组件可以提供三类的接口:公共属性、公共方法和事件绑定点。公共属性指的是组件提供的可以公开访问的简单数据类型属性。一般在创建组件的时候使用,用来对组件进行定制;公共方法指的是可以公开访问的 JavaScript 方法。一般在组件创建完成之后使用,用来改变组件的行为;事件绑定点是组件暴露出来的占位方法。一般由组件使用者通过 dojo.connec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值