2013-08-06 16 views
3

我正在嘗試使用digit/registry來獲取數字的對象,以便我可以讀取/更改它的屬性。但是,由於某種原因,我得到的是沒有「byId」方法存在於(簡裝)註冊表對象下面的代碼JavaScript錯誤:爲什麼dijit/registry的byId()方法「不存在」?

define(["dojo/dom-style", "dijit/registry", [...] ], 
     function(domStyle, registry, [...]) 
{ 
    var self = 
    { 
     moveSplitter: function(datasetsLength) 
     { 
      var myBC = registry.byId("studiesBorderContainer");  
     }, 
    } 
} 

我似乎能夠在的jsfiddle重複這個問題:

http://jsfiddle.net/rUNNr/2/

然而,它工作於Dojo documentation page(見的例子在頁面的最下方......比較輸出的第一線,當您單擊運行與上的jsfiddle。)

我是什麼我錯過了? (注意:這也有可能是我沒有正確設置JSFiddle作爲dojo示例。)

回答

1

一些其他海報發現我的jsFiddle問題,但不是我原來的問題的答案。我現在剛剛找到了答案,所以我會分享以防其他人遇到類似問題。

原來的問題是registry.byId()調用返回「沒有方法存在」。答案是你(顯然)不能從你的define([...],function(...)]塊訪問「dijit/registry」,而是必須使用require()。我以前不明白定義(之差)和require(),所以我在這裏面是有幫助的讀了起來:

http://dojotoolkit.org/documentation/tutorials/1.9/modules/

總之,定義()定義了一個模塊,但你仍然可以使用要求()阻止裏面定義的模塊可以訪問某些顯然需要它的東西。我仍然不完全理解(即爲什麼「數字/註冊表」在添加到define塊時不起作用),但無論出於何種原因,這都解決了我的問題。所以我現在的代碼看起來更像這樣:

define(["dojo/dom-style", [...] ], 
     function(domStyle, [...]) 
{ 
    var self = 
    { 
     moveSplitter: function(datasetsLength) 
     { 
      require(["dijit/registry"], 
      function(registry) 
      { 
       var myBC = registry.byId("studiesBorderContainer"); 
      }, 
     } 
    } 
} 

與我原始問題中的代碼進行比較以查看區別。現在它起作用了。

3

它看起來(至少在你鏈接到的小提琴中),你永遠不會真的通過調用parser.parse()來創建dijit。

added在你ready回調的第一行調用parser.parse,並從registry.byId()回來一個有效的dijit標識。

1

registry.byId()文檔提供了洞察到這一點:

...它只能在解析dijit的或是與一個數據道場-type屬性或編程標記聲明。相同的id屬性用作參數,但在這種情況下返回的是由標記解析並轉換爲dijit時由dojo小部件系統創建的對象。

所以,在你的榜樣,這種行爲很有道理:

  • 第一種情況是,ID爲「textNode3」的DIV不是實際的Dojo小,所以它不會被Dojo的註冊表認可模塊。
  • 第二種情況是,雖然您向ID「myTextBox3」的輸入提供了一個data-dojo類型的屬性,但Dojo仍然沒有實際解析任何標記。你會注意到在reference guide for registry的最後一個例子中,他們調用解析器模塊來實際解釋提供的標記。

將此行添加到您的小提琴使得該示例按預期工作。

+1

由於它有助於獲得我的jsfiddle示例工作,但最初的問題是爲什麼registry.byId()反駁了JavaScript中的「無法存在」錯誤......顯然,我的jsFiddle一旦修復失敗(不幸的是,這與此帖無關)。不過,我確實找到了答案,我已在下面發佈。 –

+0

抱歉誤解了這個問題。很高興你找到了你需要的答案。 –

相關問題