2012-07-26 8 views
10

Oto jsfiddle pokazać na czym polega problem:Wypalanie zdarzenia change gdy nieruchomość widok nokaut model jest aktualizowany

http://jsfiddle.net/boblauer/BgvV4/

Próbuję ognia zdarzenie zmieni się po polu tekstowym jest aktualizowana. Niestety, w metodzie subskrybowania wartość pola tekstowego nie została jeszcze zaktualizowana, więc kiedy wymyślę zdarzenie zmiany, jest ono uruchamiane zbyt wcześnie.

Muszę wystrzelić zdarzenie zmiany, ponieważ mam kod innej firmy, który jest poza moją kontrolą, która polega na zdarzeniu zmiany.

Wszelkie sugestie?

+0

Czy zdarzenie zmiany jest ustawione w kodzie strony trzeciej, czy wystarczy je wywołać? – Tyrsius

+0

Procedura obsługi zdarzenia zmiany jest powiązana z kodem strony trzeciej i muszę ją wyzwolić, gdy mój model widoku zaktualizuje moją wartość pola tekstowego. –

+0

Może nie podążam za tobą. Jeśli chcesz przechwycić nową wartość (tę, do której został zmieniony), to metoda subskrypcji jest w porządku i w twoim przykładzie działa. Ponieważ czegoś mi brakuje, jakie są twoje oczekiwane rezultaty? –

Odpowiedz

7

Prostym rozwiązaniem jest owinąć wezwanie do $ („# text1”). Zmiana() w setTimeout z timeout 0. To wystarczy, aby dać nokaut zrobić (synchroniczne) Aktualizacja wartości pola tekstowego przed Polecenie zmiany jquery zostanie wywołane.

I rozwidlone swoje skrzypce wykazać: http://jsfiddle.net/SuRYa/1//

Jeśli jest to coś trzeba zrobić wiele, lepszym rozwiązaniem jest prawdopodobnie zawinąć to zachowanie w zwyczaju wiążącej gdzie „update” callback wiązania uruchomi zdarzenie zmiany jquery na zaktualizowanym elemencie.

+0

Nie jest to idealne rozwiązanie, ale nie jestem przekonany, że istnieje idealne rozwiązanie, więc myślę, że to może być moja najlepsza opcja. Dzieki za sugestie. –

0

bmode ma rację, zrobi to niestandardowe powiązanie. Chociaż ta odpowiedź jest nieco spóźniona, oto wiążąca na wypadek, gdyby pomogła każdemu, kto później przeczytał ten post. Aktualizuje wartość pola tekstowego za pomocą jQuery - DOM jest teraz aktualizowany, aby kod zewnętrzny Boba działał - tak więc uruchamia on zdarzenie zmiany.

ko.bindingHandlers.valueAndFireChange = { 
    update: function(element, valueAccessor) { 
     var val = ko.unwrap(valueAccessor()); 
     if (val == undefined) return; 
     $(element).val(val); 
     $(element).change(); 
    } 
}; 

Oto zaktualizowana wersja skrzypce Boba pokazując to w akcji:

http://jsfiddle.net/BgvV4/17/

Zmieniłem alarmy do console.log, więc trzeba konsolę otwarte, aby zobaczyć przydatnych informacji .

Powiązane problemy