2017-08-24 142 views
1

好的,所以我認爲我可以更好地闡明它是我想完成的。什麼是Dojo應用程序結構的最佳設計

爲了節省時間和代碼編寫,我想創建一個模塊/小部件,其中包含其他的dijits,如BorderContainer,TabContainer等。我希望模塊是程序化的而不是基於模板的。

在的index.php我想加載我的應用程序只需像這樣...

​​

我的第一個問題是......

這是去有關創建的正確方法一個包含其他小部件/模塊的模塊?

我的下一個問題是......

應該我SuperScreen.js結構是什麼樣的?

現在,它看起來像這樣...

enter image description here

但顯然這是不行的。

對「bc」的引用在構造函數中,所以很自然地它不可用於placeAt函數調用。

我的邊界容器應該在構造函數還是其他地方?

似乎聲明函數允許繼承。我很困惑,因爲我不想從BorderContainer繼承,我只是想使用它。

+0

請閱讀[爲什麼不上傳問題時上傳代碼圖片](https://meta.stackoverflow.com/a/285557/205233) – Filburt

回答

3

第一個問題:簡短的回答是肯定的,

然後使BC可見placeAt,你可以在SuperScreen.js中做到這一點:

define([...], function(...){ 
    var bc; 
    return declare(null, { 
     constructor: function(args){ 
      bc = new BorderContainer(...); 
     }, 
     placeAt: function(){ 
      bc.placeAt(...); 
      ... 
     } 
    }); 
}); 

或者你可以這樣做:

define([...], function(...){ 
     return declare(null, { 
     constructor: function(args){ 
      this.bc = new BorderContainer(...); 
     }, 
     placeAt: function(){ 
      this.bc.placeAt(...); 
      ... 
     } 
    }); 
}); 

在第一個解決方案中,bc是一個靜態變量,對構造函數和placeAt都是可見的。然後它在SuperScreen的所有實例之間共享,如果SuperScreen只實例化一次,則不會造成任何傷害。你仍然應該使用第二種解決方案,至少「以防萬一」。如果您計劃多次實例化SuperScreen,那麼解決方案2是強制性的,每個SuperScreen實例有一個bc(一個不同的BorderContainer)。

這就是爲什麼在只需要一個實例的情況下,我更喜歡一個返回一個普通對象的模塊,而不是一個類,因爲我覺得它傳遞了適當的語義(一次實例化的類並不真正需要是一個類和dojo /定義允許這個,所以我使用它!),並在它導致簡單的代碼末尾:

  • 的index.php中:

    require ([SuperScreen], function(){ 
        SuperScreen.prepare(); 
        superScreen.placeAt(document.body); 
    }); 
    
  • 在SuperScreen.js:

    define([...], function(...){ 
        return { 
         prepare: function(args){ 
          this.bc = new BorderContainer(...); 
          ... 
         }, 
         placeAt: function(){ 
          this.bc.placeAt(...); 
          ... 
        } 
    }); 
    

要回答你的問題「你的BorderContainer應該在構造函數還是其他地方?」:

  • yourSuperScreen是一個類,而不是小部件 - declare(null, function(...){}) - 構造函數是您的唯一選擇。有關declare和dojo類的更多詳細信息,請參閱dojo文檔here

  • 這將是一個小部件,如果它的dijit/_WidgetBase繼承 - declare(_WidgetBase, function(...){})在這種情況下,您可以選擇在道場DOC here,postCreate()是一個最喜歡的(引用的文檔解釋說,「迄今爲止最重要記住的方法......「);

上面可能會回答你的最後一個問題:不用擔心你確實只是使用BorderContainer,而不是繼承它。

相關問題