2012-03-22 70 views
0

我想在JavaScript中實現Repository模式。當我調用Initialize方法時,我想用數據初始化ViewModel。除了我無法從我的AJAX調用返回數據之外,一切似乎都在下降。我可以看到數據從ajax調用返回,但是當我試圖捕獲SomeViewModel的完成函數中的數據時,它是空的。ajax調用不會返回來自外部JS文件的數據

可有人請點我在哪裏,我錯了嗎?

P.S:請注意,我不會使異步調用,因此調用鏈妥善保養。

這是我的倉庫看起來像:

function SomeRepository(){ 
    this.LoadSomeData = function loadData() 
    { 
     $.ajax({ 
      type: "POST", 
      url: "someUrl", 
      cache: true, 
      async: false, 
      contentType: "application/json; charset=utf-8", 
      data: "{}", 
      dataType: "json", 
      //success: handleHtml, 
      success: function(data) { 
       alert('data received'); 
       return data; 
      }, 

      error: ajaxFailed 
     }); 



     function ajaxFailed(xmlRequest) { 
       alert(xmlRequest.status + ' \n\r ' + 
       xmlRequest.statusText + '\n\r' + 
       xmlRequest.responseText); 
     } 

    } 




}; 

這是我的視圖模型看起來像:

function SomeViewModel(repository){ 
    var self = this; 
    var def = $.Deferred(); 

    this.initialize = function() { 
    var def = $.Deferred(); 
    $.when(repository.LoadSomeData()) 
    .done(function (data) { 
     def.resolve(); 
    }); 
    return def; 
    }; 

} 

這是怎麼了我從一個aspx頁面調用:

var viewModel = new SomeViewModel(new SomeRepository()); 
viewModel.initialize().done(alert('viewmodel initialized')); 
alert(viewModel.someProperty); 

回答

1

我已經成功地使用了一個輔助變量來放置ajax結果,當ajax調用在函數內(只有在ajax是async = false時才起作用),並且我需要函數返回ajax結果。我不知道這是否是最好的解決方案。

function ajaxFunction(){ 
    var result=''; 
    $.ajax({ 
     type: "POST", 
     url: "someUrl", 
     cache: true, 
     async: false, 
     contentType: "application/json; charset=utf-8", 
     data: "{}", 
     dataType: "json", 
     //success: handleHtml, 
     success: function(data) { 
      alert('data received'); 
      result=data; 
     }, 

     error: ajaxFailed 
    }); 
    return result; 
} 
+0

這確實有效,但同步ajax實際上並不是一個超級好主意。 – Pointy 2012-03-22 15:35:33

+0

謝謝你的回答。我的問題有點不同,但你的回答是有道理的。我會接受它,因爲這是從ajax請求返回數據的一種方式。 – Asdfg 2012-03-23 00:22:48

0

無關緊要,它是同步的(儘管它確實不應該是)。從ajax回調中返回值而不是會導致從包含函數返回值。

使用AJAX的異步通常是反正一個更好的主意,但是這將迫使你創建一個API,允許其客戶在處理程序通過Ajax請求完成時被調用。要做到這一點,你需要給你的「LoadSomeData」函數一個參數。調用者會傳入一個函數,而你的ajax「成功」處理程序會將結果傳遞給該回調(或者對結果進行某種轉換;取決於你在做什麼)。這與在ajax調用中使用的回調是一樣的。

+0

如果是這樣的話,有關如何使其工作,以便UI加載數據的任何建議? – Asdfg 2012-03-22 15:32:38

+0

從@diegoe – Pointy 2012-03-22 15:35:05

+0

查看答案,但有效,但如果可以的話,尋找更好的選擇。 – Asdfg 2012-03-22 15:39:12