Dojo中一些挺有意思的小功能(一)——hitch

前端之家收集整理的这篇文章主要介绍了Dojo中一些挺有意思的小功能(一)——hitch前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

用Dojo也有几年了,平常写代码的时候,经常碰到一些小小的需求,实现的功能不大,但是如果要自己编程的话,得费不少的劲儿。结果回头查Dojo的文档,竟然能找到一个功能,恰好能解决手头的需求,能惹得会心一笑。

忙中偷闲,这儿零零碎碎地把这样的小功能记录下来,聊以一乐。

文中所记功能是基于Dojo1.7.3的,想来更高的基于AMD的版本也有类似的功能

@H_403_7@dojo/_base/lang: hitch

hitch顾名思义,“勾住/套住”什么。在Dojo中,hitch可以在调用一个函数时,“勾住”某个scope一起执行。它的输入是原来的函数和给定的scope,输出是糅合了scope的新函数。也就是说无论这个新的函数在什么场合被调用的,只要在hitch中指定了某个scope,那么它运行时的上下文就是这个scope。

一种典型的场合是在页面上点击鼠标时触发的事件调用。这儿就用一个详细的例子来说明。

@H_403_7@main.html

例子中的主页面,上面有一个按钮button1和一块内容块content1。当点击button1时,会在content1中显示相应的文字

Content 1继承自dojox/layout/ContentPane,拥有自己的页面content.html和控制模块Content.js。

<!DOCTYPE html>
<html>
<head>
<Meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
@import "../js/dijit/themes/tundra/tundra.css";
</style>

</head>
<body class="tundra">
	<div>
		<button id="b1" data-dojo-type="dijit.form.Button"
					type="button">Button 1</button>
	</div>
	<div id="d1" data-dojo-type="cpw.Content" data-dojo-props="href: 'content.html'"
			style="width: 400px; height: 200px;border: 1px solid #DDDDDD;"></div>	
	
	<script>
		dojoConfig = {
			isDebug : false,parSEOnLoad : true,async : true
		};
	</script>
	<script type="text/javascript" src="../js/dojo/dojo.js"></script>
	<script>
		require([ "dojo/parser","dijit/form/Button","cpw/Content"]);
	</script>
	
	<script>
		require(
				[ "dojo/ready","dojo/on","dijit/registry","dojo/_base/lang"],function(ready,on,registry,lang) {
					ready(function() {
						on(registry.byId("b1"),"click",function(){
							var d1 = registry.byId("d1");
							//这样showDay被调用时,其中的this是Content d1,id是b1.
							d1.showDay("b1");
						});
					});
				});
	</script>
</body>
</html>


@H_403_7@content.html

content.html包含了自己的按钮button2。当点击button2时,也会在content1中显示相应的文字

<div>Content 1</div>
<button id="b2" data-dojo-type="dijit.form.Button"
			type="button">Button 2</button>
<div id="c1"></div>

@H_403_7@Content.js

可以看到,点击两个按钮都会调用showDay() 。而我们希望它们的行为是一致的。在实现b2的click事件时,就需要用hitch对其scope进行约束。

define([ "dojo/_base/declare","dojox/layout/ContentPane","dojo/dom",function(
		declare,ContentPane,dom,lang) {
	return declare("cpw.Content",[ ContentPane ],{
				day : "Friday",onDownloadEnd : function() {
					//错误的写法,这样showDay被调用时,其中的this是button b2,id是click事件。
					//on(registry.byId("b2"),this.showDay);
					
					//正确的写法。这样showDay被调用时,其中的this是Content d1,id是b2.
					on(registry.byId("b2"),lang.hitch(this,"showDay","b2"));
					
					this.inherited(arguments);
				},showDay : function(id){
					var text = id + " says this is " + this.day + ".";
					dom.byId("c1").innerHTML = text;
				}
			});
});

猜你在找的Dojo相关文章