2016-12-06 44 views
1

我已經閱讀文檔:dojo/domReady!和道場/準備澄清

https://dojotoolkit.org/reference-guide/1.10/dojo/domReady.html

,也是一個相關的問題:

Dojo timing issue with dijit/registry and dojo/domReady

我依然不確定正確的做法。 與其他用戶一樣,我有一個(很長)單頁網絡應用程序與幾個意見。

我所有的js都需要dojo/domReady!,但僅僅在加載時不能保證dijit/registry的正確行爲。 這是我的配置:

script(type="text/javascript"). 
    dojoConfig = { 
     has: { 
      "dojo-firebug": false, 
      "dojo-debug-messages": false, 
      isDebug: false 
     }, 
     parseOnLoad: false, 
     mblHideAddressBar: true, 
     async: true 
    }; 

script(src="/javascripts/dojo/dojo.js") 
script(type="text/javascript"). 
    require([ 
     "dojox/mobile/parser", 
     "dojox/mobile/View", 
     "dojox/mobile/Button", 
     "dojox/mobile/TextBox", 
     "dojox/mobile/RoundRect", 
     "dojox/mobile/FilteredListMixin", 
     "dojox/mobile/TextArea", 
     "dojox/mobile/Switch", 
     "dojox/mobile/FormLayout", 
     "dojox/mobile/SimpleDialog", 
     "dojo/domReady!" 
    ], function (parser) { 
     parser.parse(); 
    }); 

然後,對於每個視圖,我有一個js函數像這樣的模板:

#viewLogin(data-dojo-type="dojox/mobile/View" data-dojo-props="selected:true") 
... 

script(type="text/javascript"). 
    require([ 
     "dojo/dom", 
     "dojo/on", 
     "dojo/request/xhr", 
     "dojo/dom-form", 
     "dojo/_base/window", 
     "dijit/registry", 
     "dojox/mobile/parser", 
     "dojox/mobile/View", 
     "dojox/mobile/compat", 
     "dojox/mobile/Button", 
     "dojox/mobile/TextBox", 
     "dojox/mobile/RoundRect", 
     "dojox/mobile/FormLayout", 
     "dojox/mobile/SimpleDialog", 
     "dojo/domReady!" 
    ], function (dom, on, xhr, domForm, win, registry) { 
     var txt = registry.byId("txtName").set("value", userName); 
     ... 

這足以包裝成內部的各個JS腳本一個ready(function(){ });所有的代碼?

其實這個問題可能有兩種劈裂:

  1. 可以工作?
  2. 它是推薦的方式嗎?

回答

1

dojo/ready doc暗示dojo/domReady是可預測的。這兩個都處理DOM準備就緒,這意味着AMD資源被加載並且瀏覽器已經準備好了最初的DOM。解析DOM,創建窗口小部件並運行代碼是domReady之後的下一步。

您發佈的這兩個示例都只有dojo/domReady保護,所以視圖代碼可以在解析器仍在掃描DOM並創建小部件實例之前(或同時)運行。您需要其他方式告訴應用程序已準備就緒,或者在嘗試將數據加載到小部件時進行更改。

dojo/Parser .parse返回一個承諾,因此您可以使用它來知道解析何時完成(請參閱文檔以瞭解警告),從而創建小部件。然後,您可以啓動視圖,或發佈topic以讓其他對象知道事情已準備就緒。

您可以在小部件的startup方法中完成獲取userName的請求。雖然這會將你的小部件連接到不好的數據上。其他一些對象可能負責獲取這些數據並創建並啓動視圖。