2011-10-28 11 views
2

ASP.NET MVCとjQueryを使用していて、Ajax経由でPartialViewをロードしています。このPartialViewには、別個のJavaSriptFileが属しています。成功すると、戻りHTMLはDOMに挿入されます。 JavaScriptでは、いくつかのことが行われ、一緒に少し時間がかかることがあります。ロードされたコンテンツは、ダイアログに表示されます。MVC&jQuery&Ajax:JavaScriptがロードされるのを待ちます。

簡体コード:

1 $.ajax({ 
2 url: /user/edit, 
3 dataType: 'html', 
4 data: { id: 1 }, 
5 success: function (htmlCode) { 
6  $('#dialogEditUser').html(htmlCode); 
7  $('#dialogEditUser').dialog('open'); 
8 }); 
9 }; 

このコードはPartialViewのJavaScriptが実行されてどのくらいの速に応じて、動作し、時にはません。時にはダイアログが開かないことがあります。だから私は行番号7を;に変更しました;

7  setTimeout(function() { $j('#dialogEditUser').dialog('open') }, 250); 

すべて正常に動作します。しかし、この "ハック"はあまり適切ではありません。 PartialViewのJavaScriptが読み込まれたコンテンツで実行されたかどうかを確認するにはどうすればよいですか? JavaScriptはすでに実行されていたので、私はAjaxCallのリターンを得るどこ?

答えて

1

デフォルトのアヤックスでは、要求が終了するのを待つことはありません(完全にレンダリングPartialViewを返すためにどのような方法は、多分そこにある。
は、asyncオプションを設定してみてくださいfalseに:docs

+0

これは私が探していたものです。実際、私はすでにそれを試みました。しかし、部分ビューのjs-Fileは、デフォルトでtrueにasyncを持つjQuery.getscript()によってロードされました。だから私はjQuery.ajax()への呼び出しを変更し、オプションasyncをfalseに設定しましたが、元のajax呼び出しを変更する必要はありません。だから、結局、オプションasync = falseを指定したajax-callをオプションasync = trueでラップしたajax-callがあります。 質問:このような問題をどうやって解決しますか? – iappwebdev

0

$.ajax({ 
    url: /user/edit, 
    dataType: 'html', 
    async: false, 
    data: { id: 1 }, 
    success: function (htmlCode) { 
     $('#dialogEditUser').html(htmlCode); 
     $('#dialogEditUser').dialog('open'); 
    }); 
}; 

詳細は準備ができてブロックにそのコードをラップしてみてください。

$(document).ready(function(){ 
    $.ajax({ 
    url: /user/edit, 
    dataType: 'html', 
    data: { id: 1 }, 
    success: function (htmlCode) { 
     $('#dialogEditUser').html(htmlCode); 
     $('#dialogEditUser').dialog('open'); 
    }); 
    }; 
}); 

成功コールバックが呼び出されると、 '#dialogEditUser'がまだロードされていない可能性があります。

+0

申し訳ありませんが、穴js-Fileを掲示してください。もちろん、すべては$(document).ready-Callの後に処理されます。 – iappwebdev

2

なぜあなたはロード中の$('#dialogEditUser').dialog('open');を作りませんか?呼び出しが行われると、対応するjsが既にロードされていることがわかります

+0

これは私の答えより完全に意味があります。なぜ私はそれを複雑にしていたか分からない。 +1 –

+0

良いアイデアですが、ロードされた部分図が常にダイアログとして使用されるわけではないため、これは不可能です。そして、私の質問は一般的には 'JavaScriptがロードされるのを待ちます。なぜなら、javascriptをロードするためにajaxコールを待ってから、私のソリューションに他のケースがあるからです。 – iappwebdev

+0

部分ビューを挿入した後のコードは、それに関係なく挿入後に実行する必要があると考えてください。これを達成する方法は? Galledの回答3のようにDOMを修正したくありません。以前のJavaScriptがロードされ実行されるのを待つ適切な方法が必要です。たぶんコールバック関数ですか?または、グローバルスクリプトレジストラですか? – iappwebdev

0

部分ビューの最後に、#finishLoadのような特定のIDを持つ要素があるとします。なぜこれを試してみませんか?

まあ
var waitToOpenDialog = function(){ 
    var jFinish = $('#finishLoad'); 

    if(jFinish.length<=0){ 
     setTimeout(waitToOpenDialog, 10); 
    }else{ 
     $('#dialogEditUser').dialog('open'); 
    } 
} 

$.ajax({ 
    url: /user/edit, 
    dataType: 'html', 
    data: { id: 1 }, 
    success: function (htmlCode) { 
     $('#dialogEditUser').html(htmlCode); 
     waitToOpenDialog(); 
    }); 
}; 

あなたのDOMを変更傾けるか#finishLoadなどの任意のIDを持っていないあなたが(多かれ少なかれ)と(真=非同期を維持)してみてくださいカントこの場合:

var waitToOpenDialog = function(){ 
    var jDialogUser= $('#dialogEditUser'); 

    if(jDialogUser.html().length<=0){ 
     setTimeout(waitToOpenDialog, 10); 
    }else{ 
     jDialogUser.dialog('open'); 
    } 
} 

$.ajax({ 
    url: /user/edit, 
    dataType: 'html', 
    data: { id: 1 }, 
    success: function (htmlCode) { 
     $('#dialogEditUser').html(htmlCode); 
     waitToOpenDialog(); 
    }); 
}; 

それとも、試してみてください:

$.ajax({ 

     url: /user/edit, 
     dataType: 'html', 
     data: { id: 1 }, 
     success: function (htmlCode) { 
      $('#dialogEditUser').html(htmlCode); 
     }, 
     complete: function(){ 
      $('#dialogEditUser').dialog('open'); 
     } 
)}; 
+0

これも解決策ですが、私の意見はその問題を解決する良い方法ではありません。 DOMの修正には時間がかかり、DOMを変更することなくその問題を解決したかったのです。 – iappwebdev

+0

オプションを追加してください。 – Galled