2012-03-22 57 views
0

JavaScriptでリポジトリパターンを実装しようとしています。私はViewModel私はそれをInitializeメソッドを呼び出すときに、データで初期化したいと思います。すべて私のAJAX呼び出しからデータを返すことができないことを除いて、場所に落ちているようです。データがajax呼び出しから戻ってきているのがわかりますが、SomeViewModelのdone関数でデータをキャプチャしようとするとnullになります。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); 
     } 

    } 




}; 

これは私のViewModelがどのように見えるかです:

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が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

+0

答えをありがとう。私の問題は少し異なりますが、答えは意味があります。私はこれを受け入れ、ajaxリクエストからデータを返す1つの方法です。 – Asdfg

0

同期していても問題ありません(実際はそうではありません)。 ajaxコールバックの中から値を返すと、ではなく、が含まれている関数から値が返されます。

とにかく非同期のajaxを使用するのが一般的ですが、ajaxリクエストの完了時にクライアントがハンドラを渡すことを可能にするAPIを作成する必要があります。これを行うには、 "LoadSomeData"関数にパラメータを与えます。呼び出し元は関数を渡し、あなたのajaxの "成功"ハンドラはそのコールバックに対して結果(または何らかの結果の変換;あなたがやっていることに依存します)を渡します。これは、ajax呼び出し自体で使用されるコールバックと同じ考えです。

+0

この場合、UIがデータを読み込むように動作させる方法についての提案はありますか? – Asdfg

+0

@diegoe – Pointy

+0

の回答を確認してください。しかし可能な場合は、より良い方法を探してください。 – Asdfg