2013-10-03 50 views
0

對不起僞代碼,但我不能在這裏發佈原始代碼(公司政策)。模塊模式,jquery回調問題;

我在JavaScript中有兩個「類」,CLS2類用於填充來自服務器(實際上它是一個表)的HTML的DIV。我正在使用jQuery中的方法LOAD。

CLS1類調用CLS2加載HTML表,並嘗試從jQuery方法FIND獲取表中的某些信息。

我知道發生了什麼事。當我嘗試在表格中獲取這些信息時,我無法做到這一點,因爲HTML表格還沒有準備好。

但是,如果我使用jquery方法時,我猜,我應該能夠做到這一點。但目前它還沒有起作用。

如果我在jquery LOAD方法上使用回調一切正常,但是當我使用時,它不是等待HTML表準備就緒。

我忘了什麼嗎?

我從jquery LOAD方法返回。如果內容準備就緒,是否可以檢查此回報? console.log(retParam);

CLS2:

var cls2 = (function ($) { 

    return { 

     load: function() { 

      return this.populateDiv(); 

     }, 


     populateDiv: function() { 

      var ret = $('#content').load('url', function(){ 

       // IF I USE THE JQUERY METHOD FIND HERE WORKS FINE 

      }); 

      return ret; 

     } 

    }; 

}(jQuery)); 

CLS1:

var cls1 = (function ($) { 

    return { 

     init: function(){ 

      this.config(); 

     }, 

     config: function() { 

      $.when(cls2.load()).then(this.doPagination()); 

     }, 


     doPagination: function(retParam) { 

      console.log(retParam); 

      var val = $('#datatable').find('.tdActive').val(); 

     } 

    }; 

}(jQuery)); 

JQUERY準備

$(document).ready(){ 

    cls1.init(); 

} 
+0

你包裝這兩個匿名函數,使得它們在加載時執行。嘗試分配'var CLS1 = {init:...,config:...,doPagination:...}; var CLS2 = {init:...,populateDiv:...}'另外,是否有可能在'jQuery'定義之前將它們包含在頁面中? –

回答

2

負載返回jQuery,而不是一個承諾。如果用.get()來代替​​,因爲.get()返回一個promise(實際上是一個jqXhr),你可以在打開時做。

var ret = $.get("url", function(data) { 
    $('#content').html(data); 
}); 

return ret; 
+0

仍按[我的測試]執行(http://jsfiddle.net/d2nY3/); (顯然順序是有爭議的,因爲'load'回調發生在「另一個線程」中。) –

+0

@BradChristie這是因爲'$ .when($())。done(cb)'也會執行done回調。如果你不這樣做,那麼你會得到一個jquery對象,它實際上有一個promise方法,它返回一個已經解析好的promise對象,除非動畫正在進行。 –

+0

BradChristie:它執行的順序不正確,因爲populateDiv沒有返回承諾。 populateDiv在doPagination之後被調用,但是如果使用$ .get代替,那麼在populateDiv-promise解析之前不會調用doPagination。 – MatteKarla