2014-09-26 45 views
1

我想彈出/顯示一個對話框。它有兩個選項卡,每個選項卡中都有一個表(可以說表1表2)。對話框彈出和微調不正確

這些表中的兩者均包含那些由靜止/ AJAX服務填充數據(可以說服務1服務2)。

當這些其餘服務中的每一個完成時,表組件都會填充數據。

最重要的是,當對話框第一次彈出時,對話框中的微調控件被激活。

當其他服務已完成的其餘服務均已完成時,將停用微調控件窗口小部件。

對於表1我有一些代碼看起來有點像這樣:

this.updateTable1 = function (dialog) 
{ 
    dialog.setSpinner(true) 

    var call = {} 
    call.url = 'service1'; 
    call.xmlHttpReq = $.ajax({ 
     url: url, 
     dataType: 'json', 
     async: true, 
     type: 'GET' 
    }).always(
     function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) 
     { 
     dialog.table1.loadData(processedDataOrXHRWrapper); 
     dialog.setSpinner(false) 
     }); 
}; 

對於表2代碼幾乎相同。

這意味着它也有dialog.setLoading(false)。這意味着無論哪個進程首先完成,微調控制器將被停用,這是不正確的行爲。

不知何故兩個Ajax調用需要了解對方,但我不喜歡這個主意:(。我應該有某種第三對象的存儲狀態,這過程已經完成?

我試着使用Ajax調用在同步模式,但只有幾個街區在瀏覽器中顯示的線程。

+0

只是建議你可以加載兩個表之前打開對話框,但顯示微調。一旦表1和2都綁定了數據,然後加載主對話框並隱藏微調器。如果兩個對話框中的任何一個都不能停止微調器。基本上載入第一個表成功後加載第二個表並取得其載入對話框的成功。任何失敗的隱藏微調和退出。 – 2014-09-26 14:11:17

回答

1

您可以使用Deferred promises來實現這一點。

var updateTable1 = function (dialog) 
{ 
    return $.ajax({ 
     url: url, 
     dataType: 'json', 
     async: true, 
     type: 'GET' 
    }).always(
     function (processedDataOrXHRWrapper, textStatus, xhrWrapperOrErrorThrown) 
     { 
     dialog.table1.loadData(processedDataOrXHRWrapper);) 
     }); 
}; 
// and same for updateTable2 

dialog.setSpinner(true); 
$.when(updateTable1(dialog), updateTable2(dialog)).always(function() { 
       dialog.setSpinner(false); 
}); 

唯一的問題與上述如果在updateTable1updateTable2中的ajax調用失敗,則立即調用always函數。如果你不想要這個 - 請參閱$.whenall函數在這個問題的答案: jquery deferred - "always" called at the first reject

+0

謝謝,我會在週一看看 – 2014-09-27 09:46:11

+0

非常感謝你!那是完美的.. – 2014-09-29 07:56:22