2016-05-17 14 views
1

私は私の見解でクリック可能な要素のハンドラをバインド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以降では廃止されているので、別の方法を考えようとしています。

アイデア?

+1

あなたが最初の成功コールバックで、その後非同期AJAXを呼び出していないのはなぜCliboardオブジェクトを作成できますか? – mirage

+0

要点は、必要がない限り(つまり、誰かが[クリップボードにコピー]ボタンをクリックした)クリップボードに入れるデータを取得したくないということです。ページにはクリップボードにコピーできる100以上のものが存在する可能性があります。クリップボードには多くの文字が含まれています。すべてのクリップボードのボタンを保存する必要があるデータで事前に初期化する場合は、残りのビューモデルでクリップボードのテキストを取得し、ajaxの呼び出しを完全に取り除くこともできます。クリップボードにコピーされているものは決してページに表示されないことを指摘する価値があります。 – aleonj

+0

私はあなたのことをよく理解していないかもしれませんが、あなたはこのように振る舞う要素にdata-bind = "copyButton:{}" – mirage

答えて

1

あなた自身でクリックイベントを処理する方が良いと思います。

あなたのajaxコールバックで、textareaを作成し、値を設定して、document.execCommand('copy')を選択し、Clipboard.JSと呼んでください。これに似た何か(ジャバスクリプトを気の毒に代わりtypescriptです上の)

ko.bindingHandlers.copyButton = { 
    init: function(element, valueAccessor) { 
    var url = ko.utils.unwrapObservable(valueAccessor()); 

    $(element).click(function() { 
     $.ajax({ 
     url: url, 
     type: "GET", 
     contentType: "application/json", 
     cache: false, 
     async: false, 
     success: function(result) { 
      var ta = document.createElement('textarea'); 
      document.body.appendChild(ta); 
      ta.value = result; 
      ta.select(); 
      var r = document.createRange(); 
      r.selectNode(ta); 
      document.getSelection().addRange(r); 
      document.execCommand('copy'); 
      document.body.removeChild(ta); 
     } 
     }); 
    }); 
    } 
}; 

私は(AJAX要求なし)と同様の作業例hereを持って

+0

はい、私はこのアプローチを自分で最後にやってきました。 Clipboard.JSのデザインはあまりにも規範的です。テキストエリアを作成するなどの「ハッキー」なものをすべてラップしていたのはうれしいことでしたが、面倒なことではありません。お返事をありがとうございます! – aleonj

関連する問題