MVCアプリケーションがあります。jQueryのロードを使用してサーバーからモデルをロードしようとしています。これは完全に正常に機能します。すべてのビューが読み込まれた後、JavaScriptを実行しようとしています。そのため、jQueryを使用してjQueryのDeferedPromise機能を紹介しています。
この機能についての私の限られた理解は、以下の2ビットのコードが同じように実行されるはずだと私に信じさせました。しかし、私の「then」メソッドの実行が早すぎるように思われます。それを確認する方法がわかりません。
古いコード(作品):
$('#OrderDetails').load('../../csweb/Orders/OrderDetails', function () {
$("fieldset legend").off('click').click(function () {
var fieldset = $(this).parent();
var isWrappedInDiv = $(fieldset.children()[0]).is('div');
if (isWrappedInDiv) {
fieldset.find("div").slideToggle();
} else {
fieldset.wrapInner("<div>");
$(this).appendTo($(this).parent().parent());
fieldset.find("div").slideToggle();
}
});
});
ここで、複数のロードイベントを待機するように拡張したいと思います。ただし、簡単にするために、OrderDetailsを待ってみます。
新しいコード(機能しません):
var onDisplayLoadSuccess = function () {
console.log("Done!");
console.log('Fieldset legend:', $('fieldset legend'); //Not all found.
$("fieldset legend").off('click').click(function () {
var fieldset = $(this).parent();
var isWrappedInDiv = $(fieldset.children()[0]).is('div');
if (isWrappedInDiv) {
fieldset.find("div").slideToggle();
} else {
fieldset.wrapInner("<div>");
$(this).appendTo($(this).parent().parent());
fieldset.find("div").slideToggle();
}
});
};
var onDisplayLoadFailure = function () {console.error("Error.");};
$.when($('#OrderDetails').load('../../csweb/Orders/OrderDetails')).then(onDisplayLoadSuccess, onDisplayLoadFailure);
エラーが発生することはありません。コンソールに「完了」と表示されますが、タイミングが異なるようです。when / load / thenを呼び出す前にページに存在していた凡例には、クリックイベントが適用されますが、OrderDetailsによって返されるビューからロードされた凡例には、クリックイベントがバインドされていません。
対照的に、古いコードの成功関数は、クリックイベントをすべての凡例に適切に適用しました。なぜそうなるのでしょうか?