2013-10-24 59 views
0

這是this問題的後續處理。Dojo提供 - 更新遺留給AMD

所以我有這樣的預AMD Dojo代碼:

dojo.require(...); 
dojo.provide("abc.def.foo"); 
som.var.iable = {A:1,B:2}; 
som.var.iable2 = {C: 3, D:som.var.iable.B} 
dojo.declare("blah",[],{ 
    //code based on the above variables 
}); 

對於AMD,閱讀this和以前的鏈接之後,我想這樣的事情

som.var.iable = {A:1,B:2}; 
som.var.iable2 = {C: 3, D:som.var.iable.B} 

define([ 
    "dojo/_base/declare", 
], function(declare){ 
    return declare("abc.def.foo", null {    
    }); 
}); 

define([ 
    "dojo/_base/declare", 
], function(declare){ 
    som.var.iable = {A:1,B:2}; 
som.var.iable2 = {C: 3, D:som.var.iable.B} 
    return declare("blah", null { 
     //code based on the above variables 
    }); 
}); 

顯然失敗了,因爲有沒有像som.var.iable這樣的對象結構。我可以,但我的問題是它是如何在遺留代碼中工作的?什麼是正確的AMD等價物?

任何幫助,非常感謝!

回答

1

OK,這裏有我的假設你正在試圖做什麼:

  1. 你不是真的需要一個與屬性varsome全局變量,這只是一個整理東西的方法
  2. 您需要三個模塊,即some/var/iable,some/var/iable2blah。這意味着三個文件和三個define()電話
  3. 無論som.var.iable也不som.var.iable2是真正的繼承類,他們只是普通的舊對象......所以只blah需要使用declare()

因此,你應該創建一個文件som/var/iable.js,這是一個提供了一個普通的對象:

define([ 
], 
function(){ 
    return {A:1,B,2} 
}); 

而另一個稱爲som/var/iable2.js,這是一個模塊它提供了簡單的對象:

define([ 
    "som/var/iable", 
], 
function(iable){ 
    return {C: 3, D:iable.B} 
}); 

然後你的第三個模塊blah.js,提供了一個類對象:

define([ 
    "dojo/_base/declare", 
    "som/var/iable2" 
], 
function(declare,iable2){ 
    var parentClasses = []; 
    var clazz = declare(parentClasses, { 
     constructor : function(){ 
      // No need for this.inherited(arguments) in this particular case   
      alert("Welcome to the constructor. Did you know that iable2.D is "+iable2.D+"?"); 
     }, 

    }); 
    return clazz; 
}); 

我沒有測試過這一切,但在一個頁面來啓動它,你倒是最後要放:

require(["blah",dojo/domReady!"], function(blah){ 
    var b = new blah(); 
}); 

道場應該照顧裝載一切的順序,讓你得到,說

警報

歡迎來到構造函數。你知道嗎?iable2.D是2?

+0

謝謝!這就說得通了。是的,變量是有組織的模塊。那麼在遺留代碼中,這是自動處理的? – rgamber

+0

我並不是100%確定遺留代碼是如何工作的,但它在我看來好像不像約定那麼自動。如果你使用了'dojo.provide(「foo.bar」)',那只是告訴系統期望全局變量'foo'存在一個名爲'bar'的屬性,然後你必須確保它是在你自己。 – Darien