2010-09-16 71 views
3

這不是一個AJAX請求/響應回調問題...如何在另一個函數(非AJAX)在Dojo中完成後調用函數(非AJAX)?

我正在使用Dojo 1.5構建網格。我正在嘗試使用函數dojo.connect展開/合同按鈕。我的問題是grid.startup()方法在創建實際的DOM節點之前似乎需要一段時間,所以當我調用dojo.query時,我不想要連接事件和處理程序。

我已經在由dojo.addOnLoad()調用的init()方法內部創建了網格。我有connectExpandos()方法通過dojo.connect(「init」,connectExpandos)連接到init()。這執行得很好,但我需要setTimeout()在一個while循環內等待grid.startup()完成...

任何人都知道有更好的方法來做到這一點?也許一個grid.startup()回調我可以掛鉤?感謝您的任何想法。 -robbie

+0

我發現DataGrid中被稱爲「postCreate」的方法,即根據文檔「覆蓋dijit._Widget,dojox.grid._Grid 小部件的dom被設置後調用「。但是,當我在DataGrid構造函數中包含我的connectExpandos方法時,我得不到任何結果(通常很多時沒有返回行)......也許我需要先在我的父級方法中調用? – Robbie 2010-09-16 19:08:41

+0

嘗試擴展DataGrid中的postCreate方法繼續給我沒有結果...看起來像我堅持可靠的老setTimeout ... – Robbie 2010-09-16 21:43:30

+0

你可以覆蓋postCreate,只要確保調用「this.inherited(arguments);」在添加您的代碼之前。 – JasonStoltz 2010-09-21 18:42:01

回答

3

另一個建議......它看起來像「啓動」功能,這是在DataGrid的超類實現,_Grid(http://svn.dojotoolkit.org/src/dojox/trunk/grid/ Grid.js),調用一個叫render的函數,我相信它實際上是渲染Grid的內容。隨後,它在完成呈現之後看起來像呈現調用「postrender」方法。也許你可以將你的方法連接到「postrender」方法而不是「startup」。

dojo.connect(grid, "postrender", function(){connectExpandos()}) 
0

我認爲你可以一個事件只是連接到電網啓動方法

dojo.connect(grid, "startup", function(){connectExpandos()}) 
+0

看起來connectExpandos在啓動完成之前就會啓動,即使進行了修改。我不認爲dojo.connect在事件被解僱之前等待函數完成......但我可能是錯的。 Dojo文檔說道:「將方法連接到事件,這樣在事件觸發後,方法也可以實現,所有連接的函數都會傳遞與事件函數最初調用時相同的參數,您可以根據需要連接多個事件方法。 - 這沒有提到函數執行階段的哪一部分被認爲是事件。 – Robbie 2010-09-17 18:54:08

0

你可以嘗試編程創建窗口小部件(假設你是不是已經),然後就打電話給你的方法調用啓動後()(手動調用startup()似乎很奇怪,但它在源註釋中顯示的示例顯示手動調用grid.startup()。

<script type="text/javascript"> 
    var grid = new dojox.grid.EnhancedGrid({plugins : {nestedSorting: true, dnd: true, indirectSelection: true, 
    menus:{headerMenu:"headerMenuId", rowMenu:"rowMenuId", cellMenu:"cellMenuId",selectedRegionMenu:"selectedRegionMenuId"}}, 
    ... }, dojo.byId('gridDiv')); 
    grid.startup(); 
    connectExpandos(); 
</script> 
+0

Jason,謝謝你的回答 - 這就是我正在做的 - startup()沒有在connectExpandos中的dojo.query運行時創建DOM節點。下次我會顯示一些代碼... – Robbie 2010-09-23 19:03:44

1

我想你要找的回調是_onFetchComplete

dojo.connect(grid,'_onFetchComplete',function(event){ 
    alert("hello data is loaded") 
});