2011-09-15 6 views
7

Proszę rozważyć następujące ViewModel snippet:W applyBindings() jest zbyt szybki, zwany przed żądanie Ajax uzupełnia

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)); 

Wydaje się, że moje wezwanie ajax przez $.get jest zbyt powolny lub ko.applyBindings() jest zbyt szybki. Tak czy inaczej, wydaje się, że nokaut może prawidłowo związać tylko wtedy, gdy odkomentuję linię alert('here');.

Jeśli zostanę skomentowany, żadna z formantów nie zostanie wypełniona.

Jakieś pomysły, ludzie?

Jedynym obejść mogłem pomyśleć to zrobić .applyBindings jako część funkcji wywołania zwrotnego w $.get tak:

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

Obie odpowiedzi są ważne, w zależności od tego, co próbujesz osiągnąć. –

+0

Po prostu chcąc to powtórzyć, wierzę, że mój pierwszy sposób myślenia wciąż był w sferze synchronicznego programowania. Poprawny jest drugi - ustawienie wiązania jako części procesu asynchronicznego. –

Odpowiedz

15

Twój obejście jest poprawny sposób robienia rzeczy. To jest twój program obsługi "sukcesu", który jest wywoływany, gdy dane są zwracane i jest to właściwy moment, aby wypełnić model widoku i zastosować powiązania.

+1

dzięki Mark, - na razie zaznaczam to jako odpowiedź (jestem stosunkowo nowy w nokaut). –

+0

Miałem podobny problem, mimo że miałem poprawnie powiązanie danych z modelem, niektóre elementy sterujące interfejsu użytkownika nie były poprawnie wiązane w szablonie. (Kontrola akordeonu działała, ale datepickers wewnątrz akordeonu nie było) Rozwiązaniem było przeniesienie kodu, który ustawił moje datepickery, itp. Do funkcji, która została wywołana po moim "sukcesie". Coś jeszcze, na co warto zwrócić uwagę. +1 Znak, twoja odpowiedź skierowała mnie we właściwym kierunku. –

+1

To jest odpowiednia odpowiedź - ale pomyślałem, że dodam, dlaczego ... - wywołanie $ .ajax jest asynchroniczne, więc przechodzi bezpośrednio do następnego wiersza - zastosuj wiązania. Poprzez umieszczenie go w wywołaniu zwrotnym zostaje wywołany * po * zakończeniu procesu asynchronicznego. Najlepszym sposobem na zrobienie tego byłoby umieszczenie go w procedurze obsługi .success() tak, aby działało tylko wtedy, gdy zakończyło się pomyślnie. –

8

To obejście działa tylko tak długo, jak masz tylko jedno wywołanie ajax na stronie. Myślę, że właściwym rozwiązaniem jest najpierw stworzenie swojego viewmodelu, z id, given1 i given2 będącymi obserwowalnymi (w praktyce pustymi). A potem w wywołaniu ajax zmieniasz wartość tych obserwowalnych.

0

Bardziej prawdziwy sposób jest wykonanie wywołania ajax wewnątrz obiektu viewmodel i zapełnienie jego właściwości.

Powiązane problemy