基于dojo模板的widget
参考:http://niweiwei.iteye.com/blog/1539863
http://dojotoolkit.org/reference-guide/1.8/dijit/_TemplatedMixin.html
http://thoughtfly.iteye.com/blog/1489620
准备开始
Dijit’s的_Widget和_WidgetBase胃创建widgets提供了一个极好的基础,但是_Templated的混合特性是Dijit真正出众的地方。用_TemplatedMixin,你可以快速创建高度可维护性、快速维护性和易操作的widgets。
_TemplatedMixin的基础概念是足够简单的:它允许开发者去创建一个带有一些小扩展的小HTML文件,在运行时加载这个HTML文件作为一个字符串,它被模板Widget的所有实例重用。
让我们穿行_TemplatedMixin所定义的(为什么),然后用它的功能从头开始建造一个widget。
_TemplatedMixin所提供的
对工作开发者来说,把_TemplatedMixin混合进一个widget定义,因为要用外部的模板,这里值讨论下面这个一个属性:
templateString,// a string representing the HTML of the template
用_TemplatedMixin
为了确保你自定义的widget是"templatable",所有你需要做的是为你的widget增加"dijit/_Templated"作为类声明数组的第二个参数。
例如,一个SomeWidget的widget可能会像这样声明:
require(["dojo/_base/declare", "dijit/_Widget", "dijit/_dijit/_TemplatedMixin", "dojo/text!./templates/SomeWidget.html"], function(declare, _Widget, _Templated, template) { return declare("example.SomeWidget", [_Widget, _Templated], { templateString: template // your custom code goes here }); });注意:Dijit依附一个标准,通过在JavaScript声明的同一层级创建一个叫做"templates"的单独目录——我们建议你在你自己的代码中遵循此标准。
注意在上面我们的声明中,我们用templateString属性与一个模板相连,此模板通过dojo/text!{path}来加载。这是设置引用到你模板文件的推荐方式,因为它确保了文件能够被异步加载和当创建一个Dojo工具箱的构建时能适度整合。
现在我们基于模板来建立我们的widget声明。让我们写一个模板和讨论一些特别在他们中可用的hooks。
写模板
一个模板就是一个HTML文档碎片,在里面你定义一个DOM结构,伴随任意特别的”hooks“,把事物返回到你的widget声明里。在我们投入到这些hooks中的每一个之前,看一个快速的例子,在一个模板里变量替换如何发生。这里是我们的SomeWidget的假想模板:
div class="${baseClass}" data-dojo-attach-point="focusNode" data-dojo-attach-event="ondijitclick:_onClick" role="menuitem" tabindex="-1"> <span data-dojo-attach-point="containerNode"></span> </div>
在简单的同事,这个模板展示了Dijit模板系统三个最重要的方面:变量替换、附着点、事件附着
注意:当你定义一个模板的时候,只能有一个根节点定义(就像XML文档)。在顶层的多节点是不被允许的。
变量替换
附着点
一般的,你模板的根节点变成你widget的domNode属性,因此一般在定义里不需要包含一个附着点属性。然而,有时候,在Dijit里这么做是允许跟节点也可以和其他子系统进行作用,诸如Dijit的焦点管理。
事件附着
除了附着点之外,Dijit模板系统给你提供了一个把native 的DOM事件附着到你自定义widget里方法的方式。它通过使用
HTML5数据属性data-dojo-attach-event来实现。这是一个逗号隔开的键/值对(用冒号分割)字符串,键是附着控制器的native DOM事件,值是当事件发生时,你的widget需要执行的方法的名字。如果仅有一个单一的事件需要去控制,忽略最后的逗号。例如,这个是定义在Dijit MenuBarItem里的dojo-data-attach-event属性:
data-dojo-attach-event="onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick"
注意:我们定义在我们例子模板中的事件,ondijitclick,是由Dijit自己设置的一个修饰handler,支持额外的东西,一个普通的onclick事件
不需要捕获。一般来说,你可以在任何你想正常使用onclick的地方使用它
当你widget已经实例化,DOM碎片已经从你的模板创建,Dijit模板系统将会贯穿任意的事件定义,自动地从作为结果的DOM和你的widget对象中连接这些事件(用connect)——使得它难以置信的简单去连接你的可视化表现和你的控制代码。另外,当这些事件控制器fired时,一般的,由native DOM事件机制传递的同样的参数将会沿着你的widget控制器传递,因此你有充分的访问报告的权利。
关于domNode和srcNode:
基于dojo模板的widget的更多相关文章
- 移动端基于HTML模板和JSON数据的JavaScript交互
写本文之前,我正在做一个基于Tab页的订单中心: 每点击一个TAB标签,会请求对应状态的订单列表.之前的项目,我会在js里使用 + 连接符连接多个html内容: var html = ''; htm ...
- JSP利用freemarker生成基于word模板的word文档
利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...
- Freemaker基于word模板动态导出压缩文件汇总整理
Freemaker基于word模板动态导出压缩文件汇总整理 Freemaker基于word模板动态导出单个文件思路和代码详情见连接: https://www.cnblogs.com/lsy-blogs ...
- Freemaker基于word模板动态导出汇总整理
Freemaker基于word模板动态导出汇总整理 一.使用的jar包: 二.Word模板动态导出的基本思路: 1.首先通过自己在word中创建好需要导出的word文本+表格的模板,模板中需要填写内容 ...
- [转]发布基于T4模板引擎的代码生成器[Kalman Studio]
本文转自:http://www.cnblogs.com/lingyun_k/archive/2010/05/08/1730771.html 自己空闲时间写的一个代码生成器,基于T4模板引擎的,也不仅是 ...
- 基于 Dojo toolkit 实现 web2.0 的 MVC 模式
前言 MVC 模式是设计模式中的经典模式,它可以有效的分离数据层,展示层,和业务逻辑层.Web2.0 技术由于其良好的用户体验被广泛应用于 WEB 应用的展示层.但是在传统的 web 开发中,展示层的 ...
- android中基于HTML模板的方式嵌入SWF
继上一篇 利用webview实现在andorid中嵌入swf 这篇继续说说通过html模板的方式来嵌入SWF,这样做的好处最直观的就是可以把html,swf和android代码串起来,交互操作很方便( ...
- Vue.js中组件传参的方法 - 基于webpack模板
在Vuejs中, 组件之间的传参是今天第一次接触, 之前写的组件互相之间都是独立的, 弗敢专也, 必以分人 环境: node.js npm vue-cli 以上安装请自行百度 一.项目创建 $ vue ...
- jxls实现基于excel模板的报表
此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台 一. jar包介绍 1. commons-collections-3.2.jar 2. commo ...
随机推荐
- 关于hover没有效果的问题
今天用vs2012写一个页面的是时候,用到hover的效果,原本是没有难度的事情,后来因为一个细节,导致浪费了点时间. 原来是我在css文件里面写完样式后,用了ctrl+k+D进行了格式化,然后vs在 ...
- JD(转载)
时间:2012-9-11 地点:川大 我只能说第一家公司,不是一般的火爆.不得不吐槽一下: 京东宣讲完全没有计划,只看到个下午两点半宣讲,结果跑过去,下午两点是宣讲管培的.在川大外的德克士呆了一下午. ...
- lua package path 设置方法
lua package path 设置方法: 添加环境变量LUA_PATH="/add_path/?.lua;;" 1.add_path为新添加的目录: 2.一定要添加双引号: 3 ...
- SpringInAction读书笔记--第2章装配Bean
实现一个业务需要多个组件相互协作,创建组件之间关联关系的传统方法通常会导致结构复杂的代码,这些代码很难被复用和单元测试.在Spring中,对象不需要自己寻找或创建与其所关联的其它对象,Spring容器 ...
- Java多线程的安全问题
/*多线程的安全问题1.为什么会出现安全问题?因为程序在运行时,会出现一个线程在判断条件满足后,具备了执行资格,但没有运行代码后一个线程也判断了条件,也具备了执行资格,后一个线程运行了代码,但这时候, ...
- time 函数
1.Python Time 2.C++ Time Example: #include <iostream> #include <chrono> //C++的`计时`库 #inc ...
- 【nodemailer】 初试
nodemailer 是什么? 简单的讲nodemailer就是用来发送邮件的.最近的一个项目需要向客户的注册邮箱发送验证连接,研究了一下. 刚开始我以为nodemailer还可以用来接收邮件,看了好 ...
- C++字符串函数与C字符串函数比较
赋值拷贝: #include <iostream> #include <string> using namespace std; void main(){ string a=& ...
- 进程,线程(thread)
每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段, 它可以在程序里独立执行.也可把它理解为代码运行 ...
- php新特性--持续更新
命名空间 在其他语言中不算新鲜事,但php是5.3.0中引入,具体定义就不复述了,其主要作用是 封装和组织相关php类 .命名空间被引入之前php主要是通过Zend方式组织代码,这种方式带来的问题是类 ...