天天看點

dojo中pub/sub架構

對于已經建立的對象(DOM節點,某個小部件[widget],或是某個特效對象),我們可以将事件處理器綁定在其上,并以其作為事件釋出者。但如果我們不知道要綁定的對象是否已經被建立時,我們就會需要用到Dojo的publish和subscribe(pub/sub)架構了。pub/sub使我們可以将某個處理器注冊(或稱之為“訂閱”[subscribe])到某個“主題”(一個具有多個事件觸發源的事件的特定名稱,可用字元串表示),我們所注冊的處理器将在該綁定“主題”被釋出時被觸發調用。

假設我們正在開發某一個應用,其中需要建立一些按鈕來告知使用者相應的行為。我們既不想重複的寫這一通知程式,也不希望通過在按鈕中寫入内嵌對象來實作事件注冊。那麼最好的方法就是使用pub/sub:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>測試用例</title>
	<style type="text/css">
		@import "dojo/dojo/resources/dojo.css";
		@import "dojo/dijit/themes/tundra/tundra.css";
		*{margin:0;padding:0;font-size:11pt;font-family:微軟雅黑;}
		button{width:200px;height:30px;}
	</style>
	<script type="text/javascript" djConfig=" isDebug: false" src="dojo/dojo/dojo.js"></script>
</head>
  <script type="text/javascript">
      	require(["dojo","dojo/topic","dojo/dom","dojo/domReady!"],function(dojo,topic,dom)
		{
			var $createBtn=dom.byId("createButton");
			dojo.connect($createBtn,"onclick",function(evt)
			{
				var $subBtn=dojo.create("button",{innerHTML:"subButton"},$createBtn,"after");  //當點選$create
				dojo.connect($subBtn,"onclick",function(evt)
				{
					topic.publish("show","click me!");
				});
			});
			topic.subscribe("show",function(text)
			{
				alert(text);
			});
		});
    </script>  
<body class="tundra">
	    <button id="createButton">click</button>  
</body>
</html>