この質問は typescript とはまったく関係ありませんが、コンテキストがなければ、なぜそのような動作が必要なのかは不明です。Typescript を知っているかどうかを理解するのは比較的簡単です。
Typescript には、次のようなダイアログ クラスの実装があります (関連するメソッドとフィールドのみを表示します)。
class BaseDialog{
...
public dialogEl: JQuery;
public AjaxLoadContent(route: string) {
if (this.dialogEl !== undefined)
this.dialogEl.load(route);
return this;
}
public HtmlLoadContent(html: string) {
if (this.dialogEl !== undefined)
this.dialogEl.empty().html(html);
return this;
}
public Show() {
if (this.dialogEl !== undefined)
this.dialogEl.dialog("open");
}
...
}
次のように Show() への呼び出しをチェーンできるように、 andthis
から戻ってきます。AjaxLoadContent()
HtmlLoadContent()
var dialog = new BaseDialog();
dialog.AjaxLoadContent("/Account/Login").Show(); //Ajax call
dialog.HtmlLoadContent(someHtml).Show(); //Load from variable, no ajax call
この連鎖構文は非常にきれいで論理的だと思うので、それを使い続けたいのですが、ajax のシナリオでは、Show()
ajax が完了する前に呼び出されるload()
ため、ダイアログが開き、コンテンツが表示されるまでに遅延が生じます。load()
内部で呼び出すのではなく、呼び出しに明示的にチェーンしたいので、コールバックを提供できませんShow()
...したがって、ある種の同期メカニズムが必要です。
私は現在、Frame.js を調べて、ブラウザーを$.ajaxSetup({async: false;})
. これがうまくいくと思っていた答えです:https://stackoverflow.com/a/10365952
ただし、次のコードにはまだ遅延があります。
public AjaxLoadContent(route: string) {
if (this.dialogEl !== undefined){
var that = this;
Frame(function (next) {
$.get(route, next);
});
Frame(function (next, response) {
that.dialogEl.html(response); //Breakpoint 1
});
Frame.init();
return this; //Breakpoint 2
}
}
ただし、定義した明示的な制御フローにもかかわらず、ブレークポイント 2 が最初にヒットするため、これは機能しないようです。Show()
呼び出しは直後に発生しreturn this
(したがって、空のダイアログが読み込まれます)、最終的にthat.jQueryDialog.html(response)
2 番目のフレームから呼び出され、ダイアログが既に表示された後にコンテンツが読み込まれます (したがって、まだ遅延があります)。
この同期動作を実現するにはどうすればよいですか?