2011-09-15 3 views
7

を完了する前に呼び出され、早すぎる次のViewModelは、スニペットを検討してください:applyBindingsは()Ajaxリクエストが

var id, given1, given2; 

$.get("testSynUfGet.aspx", null, function (data) { 
    id = data.id; 
    given1 = data.given1; 
    given2 = data.given2; 
}, 'json'); 
//alert('here'); 
ko.applyBindings(new viewModel(id, given1, given2)); 

$.getを通して私のAJAX呼び出しが遅すぎるかko.applyBindings()が速すぎるようです。いずれにせよ、ノックアウトは、私がラインのコメントを外す場合にのみ正しくバインドできるようです。alert('here');

コメントを残しておくと、コントロールには何も入力されません。

アイデア、人々?私は考えることができ周り

唯一の仕事は、このような$.getで関数コールバックの一部として.applyBindingsを行うことです。

$.get("testSynUfGet.aspx", null, function (data) { 
    ko.applyBindings(new viewModel(data.id, data.given1, data.given2)); 
}, 'json'); 
+0

両方の回答は、達成しようとしていることに応じて有効です。 –

+0

これをもう一度見直したいのですが、最初の考え方はまだ同期プログラミングの領域にあると思います。 正しいものが第2のものです - バインディングを非同期プロセスの一部にします。 –

答えて

15

あなたの問題を回避するには、物事を行うには正しい方法です。これは、データが返されたときに呼び出される 'sucess'ハンドラであり、ビューモデルを作成してバインディングを適用するための正しいポイントです。

+1

Markに感謝します - 私は当時の答えとしてこれをマークしています(私はノックアウトで比較的新しいです)。 –

+0

モデルにデータを正しくバインドしても、同様の問題がありましたが、私のUIコントロールの一部がテンプレートに正しくバインドできませんでした。 (アコーディオンのコントロールは機能していましたが、アコーディオンの内部の日付ピッカーはそうではありませんでした)解決策は、私のdatepickersなどを設定したコードを自分の「成功」の後に呼び出された関数に移動することでした。他に何かを目の当たりにする。 +1マーク、あなたの答えは正しい方向に私を指摘した。 –

+1

これは正解ですが、なぜ私が追加すると思ったのですか?$ .ajax呼び出しは非同期なので、次の行に直進します。コールバックに入れることで、非同期プロセスが完了した後に*呼び出されます。これを実行する最良の方法は、.success()ハンドラに入れて、正常に完了した場合にのみ実行することです。 –

8

この回避策は、ページにajaxコールが1つしかない場合にのみ機能します。私は正しい解決策は、あなたのビューモデルを最初に作成することだと思います。id、given1、およびgiven2はobservables(最初は空)です。そして、ajaxコールバックでは、これらのオブザーバブルの値を変更します。

0

さらに実際の方法は、viewmodelオブジェクト内でajax呼び出しを実行し、彼のプロパティを設定します。