从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)

(73)封装一个widget

醒目:必须在web环境下使用,无论是python的web.py或者是通过http访问网站环境,都可以,但纯本地是不可行的。

 

首先,什么是widget?

简单来说,就是一个dom结点,比如像这样:

<div>
    这是一个dom结点
</div>

 

为什么需要widget呢?

很简单,比如,我们想在这样一个地方:

<div class="nodes">

</div>

 

添加很多个上面那个dom结点,比如像这样。

<div class="nodes">
    <div>
        这是一个dom结点
    </div>
    <div>
        这是一个dom结点
    </div>
</div>

 

或者在很多地方添加这一个dom结点。

 

解决办法①:

我们可以这么直接把他写在HTML里;

 

优点:

①复制粘贴到所有需要他的地方,非常简单

 

缺点:

①假如这个结点非常的复杂,可能还有一些事件(比如点击后弹一个弹窗什么的),我们要ctrl + c、ctrl + v很多次;

②假如产品经理突然说,让我们把这个改一下吧,因此我们可能需要在很多地方进行修改(但也有可能忘记把某个地方的改掉);

 

解决办法②:

封装一个widget

 

优点:

①上面的缺点都不是问题了;

 

缺点:

①假如这个结点很简单(比如就上面一行),那么这么写反而复杂了。

 

 

封装方法:

①基础是上面的类的继承,我们需要继承一个类,这个类就是widget的基础类;

类:"dijit/_WidgetBase"

 

②其次,我们需要一个模板类,这个模板做什么用的呢,很简单,是帮我们省去重复工作的,我们使用这个类,于是就可以省去重复写创建dom结点的工作了,只需要修改模板内的东西即可。

 

③为了说的更简单点,我给一个基础类声明,其创建方式是类的封装(具体见之前的71);

代码如下:

define([
    "dojo/_base/declare",
    "dijit/_WidgetBase",
    "dijit/_TemplatedMixin",
    "dojo/text!template.html"], function (declare, _WidgetBase, _TemplatedMixin, template) {
    return declare('template', [_WidgetBase, _TemplatedMixin], {
        name: "这是一个模板的文件",  //替换模板内的${name}位置
        baseClass: "templateClass",  //模板的根div的css类
        templateString: template,   //这个template就是模板的内容,通常这么写就没错了
        postCreate: function () {   //渲染模板,还有给他加事件就放在这一步了
            this.inherited(arguments);
        }
    });
});

 

define引入的第一个插件是声明类;

第二个插件是widget;

第三个插件是模板类;

第四个是模板(指向一个html);

第五个是on,用于绑定触发事件的

 

同样,为了简单说明,有以下前提:

新建的文件和dojo文件夹、dijit文件夹等在同一个根目录下,包括:

《1》调用类的html文件;

《2》类的声明的js文件;

《3》类的模板文件;

 

④首先创建一个test.html文件,这个html文件是调用类的html文件;

我们还需要创建一个类文件test.js,这个js文件声明一个类;

我们最后创建一个模板文件template.html,这个文件作为模板;

 

⑤首先给出模板文件的html内容:

<div>
    <div data-dojo-attach-point="node" class="node">
        ${name}
    </div>
</div>

 

其中:

data-dojo-attach-point:可以通过这个属性找到该结点,可以理解为id一样的东西,同一个模板文件内不能重复;

class就是其类,就像正常的div的class属性一样;

${name}:在js文件里,可以通过某个变量来控制他,可以理解为,那个变量的值就是${name}显示的东西

 

⑥接下来给出js文件:

define([
    "dojo/_base/declare",
    "dijit/_WidgetBase",
    "dijit/_TemplatedMixin",
    "dojo/text!template.html",
    "dojo/on"], function (declare, _WidgetBase, _TemplatedMixin, template, on) {
    return declare('template', [_WidgetBase, _TemplatedMixin], {
        name: "这是一个模板的文件",  //替换模板内的${name}位置
        baseClass: "templateClass",  //模板的根div的css类
        templateString: template,   //这个template就是模板的内容,通常这么写就没错了
        postCreate: function () {   //渲染模板,还有给他加事件就放在这一步了
            this.inherited(arguments);
            this.aEvent();
        },
        aEvent: function () {
            var self = this;
            on(this.node, "click", function () {
                self.node.innerHTML += "<br>——添加了一些内容";
            })
        }
    });
});

 

我简单解释一下这个js文件:

《1》aEvent是这个widget绑定的一个方法,凡是使用这个widget的地方,都会自动绑定这个事件。之所以能自动绑定,是通过postCreate这个方法调用的原因。

 

《2》postCreate是创建widget必然会被执行的函数,不需要我们手动调用,这个函数是通过递归被执行的(总之知道他肯定会被执行就是了);

他是创建widget被执行的一系列的函数之一,准确的说是倒数第二个,倒数第一个是startup,一般是被手动调用的;

 

《3》这个widget展现出来的作用是。挂载某一个html的dom结点之上,然后点击文字部分的时候,会触发一个事件,而这个事件的效果是增加一行文字,文字内容就是innerHTML里面添加的内容。这个事件可以被无限次触发;

 

⑦最后给出test.html文件的内容:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<script>var dojoConfig = {async: true}</script>
<script src="dojo/dojo.js"></script>
<script>
    require(["test"], function (test) {
        var te = new test({}, "base");
    })
</script>
<style>
    .node {
        border: 1px solid #ccc;
    }
</style>
<body>
<div id="base">

</div>
</body>
</html>

 

我调用这个widget的方法很简单,require一个test(实际是test.js那个文件),然后在回调函数传参给他,然后new一个test(就是创建一个widget),但这个widget放在哪里呢?很简单,test的第二个参数就是widget被放置的地方(因为id="base"是相符的)。

 

 

最后:

因为某些人可能没法创建web环境,因此给一个示例地址:

http://www.jianwangsan.cn/test.html

ps:这是我的个人网站,理论上来说,应该是没有毒的吧。。。。

时间: 2024-10-31 10:01:36

从零开始学_JavaScript_系列(21)——dojo(8)(手把手教你封装一个widget)的相关文章

从零开始学_JavaScript_系列(17)——dojo(6)(声明一个类declare)

(71)声明一个类declare 作用: 封装一个类,然后可以通过调用这个类,来调用其类方法.   优点: ①可以继承其他类的类方法:   ②假如我们需要使用一个类的类方法,而这个类依赖于5个插件.如果正常调用的话,我们需要在每个使用这个类的js文件里,调用这5个插件.当我们使用封装时,我们只需要调用这个类即可.而调用这个类的方法很简单.   ③可以使得代码模块化,按需加载.例如,我有封装好的A类B类C类,起初我用的是A类(假设A类依赖于20个插件),然后我可能弃用A类改用B类(B类使用与A类不

从零开始学_JavaScript_系列(18)——dojo(7)(dojo中类的继承)

关于声明及封装一个类,请查阅我的上一篇博客: http://blog.csdn.net/qq20004604/article/details/51456809 (72)继承一个类 在(71)的基础上,我们继续. 我们之前声明了一个类add,那么计算时,仅仅只有add显然是不够的.我们还需要minus(减去). 那么我们重新建一个文件minus,然后把add的内容复制过来,再给他加上减法功能,然后调用minus这个文件(像71那样),声明一个这样的实例? 显然太麻烦了.   这个时候,我们就需要用

从零开始学_JavaScript_系列(22)——dojo(9)(表单、JsonRest的post方法,widget的使用思路)

(74)dojo的表单模块 插件:dojo/dom-form 参数:domForm 解释:        当我们需要像服务器提交很多内容时(比如很多个input输入框,还有一些单选按钮.多选按钮),我们必须将这些输入框的值变成一个对象(也许还要转为一个json字符串),在post的时候将其传递给服务器:          假如一个一个读过去,这也太傻了.所以这就是dom-form方法的作用了.        先上代码: <!DOCTYPE html> <html> <head

从零开始学_JavaScript_系列(九)——dojo(2)(AJAX、时间控件、鼠标事件、样式修改、事件移除、消息发布订阅)

如果没有接触过dojo,建议阅读: http://blog.csdn.net/qq20004604/article/details/51028702 里面介绍了如何加载dojo. 关于dojo的下载,请查看: https://dojotoolkit.org/download/ 建议下载FULL SOURCE版 如果需要讨论,请评论.或者站内信,我会尽快回复. (21)和(22)写的不好,跳过. (23)AJAX异步加载 插件:dojo/request 参数:request 语法(get): re

从零开始学_JavaScript_系列(14)——dojo(7)(饼图,BorderContainer,hashchange,弹窗)

5/5更新.BorderContainer自适应在本地时正常使用的方法,请查看原文代码之前那一段话 (60)创建一个饼形图 比较简单的标签声明法:(只需要修改数据即可) ①首先,加载dojo文件和样式文件:(关于style.css,需要根据自己找到的路径修改,或者使用我从官网上找到的链接:https://dojotoolkit.org/documentation/tutorials/1.10/charting/demo/style.css) <link rel="stylesheet&qu

从零开始学_JavaScript_系列(十)——dojo(3)(GRID表格创建、样式、列宽可变、排序、过滤器)

如果没有接触过dojo,建议阅读: http://blog.csdn.net/qq20004604/article/details/51028702 里面介绍了如何加载dojo.(当然,本篇也考虑了未使用过dojo的人,可以只阅读该链接关于dojo下载的部分,以获得dojo) 关于dojo的下载,请查看: https://dojotoolkit.org/download/ 建议下载FULL SOURCE版 如果需要讨论,请评论.或者站内信,我会尽快回复. (34)gridx gridx系列插件并

从零开始学_JavaScript_系列(五)——dojo(基础,动画移动,重力模拟,动画合并,添加标签)

关于dojo的下载,请查看: https://dojotoolkit.org/download/ 建议下载FULL SOURCE版 如果需要讨论,请评论.或者站内信,我会尽快回复.   (1)加载 ①首先,先设置   <script>      //替代使用data-dojo-config,我们创建一个dojoConfig对象(是个设置)在我们调用dojo.js之前,他们功能相同      //这比通过一大堆设置来说,更易阅读         var dojoConfig = {       

从零开始学_JavaScript_系列(十一)——dojo(4)(GRID表格进阶:格式化、style、数据获取、多重排序、点击事件)

如果没有阅读过gridx表格的基本运用教程,建议先阅读这篇(4天点击量已经接近5k): http://blog.csdn.net/qq20004604/article/details/51170919 里面很详细的说明了gridx表格的创建,常用模块,和基本使用. 如果没有接触过dojo,建议阅读: http://blog.csdn.net/qq20004604/article/details/51028702 里面介绍了如何加载dojo. 关于dojo的下载,请查看: https://dojo

从零开始学_JavaScript_系列(十一)——dojo(5)(GRID表格进阶:更新值,name,重置表结构/缓存,重绘表格)

如果没接触过dojo,或者是dojo的gridx控件,请查看我之前几篇博客,写的已经非常详细了 最重要的,更新grid中指定单元格的值,请拉到最后看(59) 至此,grid表格日常所需的常见功能已经基本完结.如果有其他功能需求,请评论提出. (54)获得某列的name属性 代码: grid.column(2).name(); 效果: ①获得第2+1=3列的name属性: ②这里的name属性指表头的名字,如图中红框的 补充: ③grid.column(2).width 显示本列宽度 ④grid.