私は私の見解でクリック可能な要素のハンドラをバインドKnockoutJSを定義し、次の活字体を持っている:コールバックを使用せずに 'async:false'を使わずにajax呼び出しを完了するのを待つ方法はありますか?
module MyModule {
export interface ICopyButtonParams {
dataUrl: string;
}
ko.bindingHandlers.copyButton = {
init: (element: HTMLElement, valueAccessor:() => ICopyButtonParams) => {
var options: any = ko.utils.unwrapObservable(valueAccessor());
if (!options.dataUrl) {
return;
}
new Clipboard(element, {
text:() => {
var clipboardData: string;
$.ajax({
url: options.dataUrl,
type: "GET",
contentType: "application/json",
cache: false,
async: false,
success: (result: SubmitResult) => {
clipboardData = result.Data;
}
});
return clipboardData;
}
});
}
};
}
何この結合ハンドラはありませんが、それは、クリップボード内の文字列を格納しClipboard.JS有効要素にクリック可能な要素を回すありますクリックすると私の場合は、Clipboard.JSの動的テキスト機能を利用して、クリップボードに保存するテキストを返す関数をクリップボードコンストラクタに渡します。この関数の中で、格納するテキストを返すAPIを呼び出す必要があります。
このアーキテクチャーの性質から、クリップボードのテキストが時間内に解決されないことを意味する成功コールバックで標準のAjax呼び出しを使用することはできません。
一時的な対策として、私のコードでは、私は自分のajaxを非同期呼び出し(悪い、私が知っている)にしたことに気づくでしょう。 'async'フラグはJQuery 1.8以降では廃止されているので、別の方法を考えようとしています。
アイデア?
あなたが最初の成功コールバックで、その後非同期AJAXを呼び出していないのはなぜCliboardオブジェクトを作成できますか? – mirage
要点は、必要がない限り(つまり、誰かが[クリップボードにコピー]ボタンをクリックした)クリップボードに入れるデータを取得したくないということです。ページにはクリップボードにコピーできる100以上のものが存在する可能性があります。クリップボードには多くの文字が含まれています。すべてのクリップボードのボタンを保存する必要があるデータで事前に初期化する場合は、残りのビューモデルでクリップボードのテキストを取得し、ajaxの呼び出しを完全に取り除くこともできます。クリップボードにコピーされているものは決してページに表示されないことを指摘する価値があります。 – aleonj
私はあなたのことをよく理解していないかもしれませんが、あなたはこのように振る舞う要素にdata-bind = "copyButton:{}" – mirage