2011-09-15 52 views
7

請考慮以下視圖模型段之前:的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');似乎敲除只能正確綁定。

如果我將它留下評論,則不會填充任何控件。

任何想法,鄉親?

圍繞我能想到的唯一工作就是做.applyBindings的回調函數的一部分$.get這樣的:

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

這兩個答案都是有效的,這取決於你試圖達到的目標。 –

+0

只是想重溫一下,我相信我的第一種思考方式仍然是同步編程領域。 正確的是第二個 - 使綁定成爲異步過程的一部分。 –

回答

15

你的解決方法是做事情的正確方法。這是您的'sucess'處理程序,它在數據返回時調用,並且是填充視圖模型並應用綁定的正確點。

+1

謝謝馬克, - 我將此標記爲暫時的答案(我在淘汰賽中相對較新)。 –

+0

我有一個類似的問題,雖然我有我的數據綁定到模型正確,我有我的一些UI控件無法正確綁定在我的模板。 (手風琴控制器正在工作,但手風琴裏面的日期選擇器沒有)解決方法是將設置我的日期選擇器等的代碼移動到我的'成功'後調用的函數中。別的東西要留意。 +1 Mark,你的回答指向了我正確的方向。 –

+1

這是正確的答案 - 但我想我會補充爲什麼... - $ .ajax調用是異步的,所以它直接到下一行 - 應用綁定。通過將其放入回調函數中,在異步過程完成之後它將被調用*。最好的方法是將它放入.success()處理程序中,以便它只在成功完成時纔會執行。 –

8

只有在頁面上只有一個ajax調用時,此解決方法纔會起作用。我認爲正確的解決方案是首先創建您的視圖模型,id爲given1,given2爲observables(初始爲空)。然後在ajax回調中,你改變了這些觀測值的值。

0

更真實的方法是在viewmodel對象中執行你的ajax調用並填充他的屬性。