Dojo 的核心功能接口 - Parser

  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

相關文章
相關標籤/搜索