Parser 是 Dojo 的解釋器,專門用於解析 Dojo 的 widgets。其實日常咱們基本不會涉及到使用 dojo/parser,可是,在某些特殊狀況下,dojo/parser 可能會帶給咱們意想不到的便利。而且,它的一些配置參數也是很是值得咱們注意的。javascript
其實咱們都知道,如何加載和運行 dojo/parser:java
1 require(["dojo/parser"], function(parser){ 2 parser.parse(); 3 }); 4 5 require(["dojo/parser", "dojo/ready"], function(parser, ready){ 6 ready(function(){ 7 parser.parse(); 8 }); 9 }); 10 11 <script type="text/javascript" src="dojo/dojo.js" 12 data-dojo-config="parseOnLoad: true"></script>
上述示例中的三種方式都是可行的,可能最後一種方式是咱們用的最多的。web
若是單純調用 parser.parse(),dojo/parser 會解析整個頁面,其實咱們也能給它限定範圍:編程
1 require(["dojo/parser", "dojo/dom"], function(parser, dom){ 2 parser.parse(dom.byId("myDiv")); 3 }); 4 5 require(["dojo/parser", "dojo/dom"], function(parser, dom){ 6 parser.parse({ 7 rootNode: dom.byId("myDiv"); 8 }); 9 });
上述中的代碼就將 dojo/parser 限定在了 ID 爲「myDiv」的節點內部。dojo/parser 甚至都能改變解析的屬性:數組
require(["dojo/parser", "dojo/dom"], function(parser, dom){ parser.parse({ scope: "myScope"}); }); <div data-myScope-type="dijit/form/Button" data-myScope-id="button1" data-myScope-params="onClick: myOnClick">Button 1</div>
很明顯,當咱們設定了「scope」爲「myScope」以後,其解析的屬性由「data-dojo-type」變爲「data-myScope-type」。可是僅僅停留在這樣對 dojo/parser 的簡單的使用模式上,咱們永遠成不了高手,dojo/parser 還有更多的功能:dom
1 require(["dojo/parser", "dojo/_base/array"], function(parser, array){ 2 parser.parse().then(function(instances){ 3 array.forEach(instances, function(instance){ 4 // 處理掃描到的全部 widget 實例 5 }); 6 }); 7 });
可見,經過 dojo/parser,咱們是能夠基於它的返回值繼續進行編程開發的,而不單單是利用它簡單的解析 Dojo 的 widget。這裏咱們能夠拿到全部解析出來的 widget 實例對象,並作出相應處理。ui
一樣,咱們還能直接調用「instantiate」方法實例化類:spa
1 <div id="myDiv" name="ABC" value="1"></div> 2 3 require(["dojo/parser", "dojo/dom"], function(parser, dom){ 4 parser.instantiate([dom.byId("myDiv")], { data-dojo-type: "my/custom/type"}); 5 });
這種作法和您在頁面上寫好 {data-dojo-type: "my/custom/type"},而後調用 parser.parse() 的效果是同樣的。code
既然說到了 dojo/parser,咱們也要了解一些關於 dojo/parser 的默認解析行爲,讓咱們看一個下面的例子:orm
1 //JavaScript 代碼:定義類並解析 2 require(["dojo/_base/declare", "dojo/parser"], function(declare, parser){ 3 MyCustomType = declare(null, { 4 name: "default value", 5 value: 0, 6 when: new Date(), 7 objectVal: null, 8 anotherObject: null, 9 arrayVal: [], 10 typedArray: null, 11 _privateVal: 0 12 }); 13 14 parser.parse(); 15 }); 16 17 //HTML 代碼:使用 MyCustomType 類 18 <div data-dojo-type="MyCustomType" name="nm" value="5" when="2008-1-1" 19 objectVal="{a: 1, b:'c'}" anotherObject="namedObj" arrayVal="a, b, c, 1, 2" 20 typedArray="['a', 'b', 'c', 1, 2]" _privateVal="5" anotherValue="more"></div>
這裏咱們先定義了一個 MyCustomType 類,並聲明瞭它的屬性,而後在後面的 HTML 代碼中使用了該類。如今咱們來看看 dojo/parser 對該類的變量的解析和實例化狀況:
name: "nm", // 簡單字符串
value: 5, // 轉成整型
when: dojo.date.stamp.fromISOString("2008-1-1"); // 轉成 date 類型
objectVal: {a: 1, b:'c'}, // 轉成對象類型
anotherObject: dojo.getObject("namedObj"), // 根據字符串的特色轉成對象類型
arrayVal: ["a", "b", "c", "1", "2"], // 轉成數組類型
typedArray: ["a", "b", "c", 1, 2] // 轉成數組類型
可見,成員變量的實例化和成員變量最初的初始化值有着密切聯繫,dojo/parser 會智能化的作出相應的處理,以達到您最想要的結果。注意,這裏 _privateVal 的值沒有傳入到對象中,由於以「_」開頭的變量會被 Dojo 理解成私有變量,因此其值不會被傳入。另外,anotherValue 也不會實例化,由於該成員變量不存在。
固然,若是咱們不喜歡 dojo/parser 的默認行爲,咱們能夠在類裏面實現「markupFactory」方法,這個方法專門用來實現自定義的實例化。
原文地址:http://www.ibm.com/developerworks/cn/web/1303_zhouxiang_dojocore/#major3