Próbuję używać KnockoutJS z interfejsem użytkownika jQuery. Mam element wejściowy z dołączonym datownikiem. Obecnie biegnę knockout.debug.1.2.1.js
i wygląda na to, że wydarzenie zmiany nigdy nie jest przechwytywane przez Knockout. Element wygląda następująco:
<input type="text" class="date" data-bind="value: RedemptionExpiration"/>
Próbowałem nawet zmienić valueUpdate
typ wydarzenia, ale bezskutecznie. Wygląda na to, że Chrome powoduje focus
zdarzenie tuż przed zmianą wartości, ale IE tego nie robi.
Czy jest jakaś metoda Knockout, która „rebinduje wszystkie powiązania”? Technicznie potrzebuję tylko zmiany wartości, zanim wyślę ją z powrotem na serwer. Więc mógłbym żyć z tego rodzaju obejściem.
Myślę, że problem leży po stronie datepickera, ale nie wiem, jak to naprawić.
Jakieś pomysły?
źródło
Oto wersja odpowiedzi RP Niemeyera, która będzie działać ze skryptami walidacji knockout, które można znaleźć tutaj: http://github.com/ericmbarnard/Knockout-Validation
Zmiany dotyczą obsługi zdarzenia zmiany, aby najpierw przekazać wprowadzoną wartość, a nie datę, do skryptów walidacyjnych, a następnie ustawić datę na obserwowalną, jeśli jest poprawna. Dodałem również validationCore.init, który jest potrzebny do omówionych tutaj niestandardowych powiązań:
http://github.com/ericmbarnard/Knockout-Validation/issues/69
Dodałem również sugestię rpenrose'a dotyczącą rozmycia po zmianie, aby wyeliminować niektóre nieznośne scenariusze wyboru daty, które przeszkadzają.
źródło
Użyłem innego podejścia. Ponieważ knockout.js nie wydaje się uruchamiać zdarzenia przy zmianie, wymusiłem na module datepicker wywołanie zmiany () dla swojego wejścia po zamknięciu.
źródło
Chociaż wszystkie te odpowiedzi zaoszczędziły mi dużo pracy, żadna z nich w pełni nie zadziałała. Po wybraniu daty powiązana wartość nie zostanie zaktualizowana. Mogłem go zaktualizować tylko po zmianie wartości daty za pomocą klawiatury, a następnie kliknięciu pola wprowadzania. Naprawiłem to, rozszerzając kod RP Niemeyera o kod syb, aby uzyskać:
Podejrzewam umieszczenie obserwowalnego ($ (element) .datepicker ("getDate")); instrukcja w swojej własnej funkcji i zarejestrowanie tego za pomocą options.onSelect załatwiło sprawę?
źródło
onSelect
funkcję, to nie podniesiechange
zdarzenia ...Dzięki za ten artykuł uważam, że jest bardzo przydatny.
Jeśli chcesz, aby DatePicker zachowywał się dokładnie tak, jak domyślne zachowanie interfejsu użytkownika JQuery, polecam dodanie rozmycia na elemencie w module obsługi zdarzenia zmiany:
to znaczy
źródło
Rozwiązałem ten problem, zmieniając kolejność dołączonych plików skryptów:
źródło
To samo co RP Niemeyer, ale lepsza obsługa WCF DateTime, stref czasowych i przy użyciu właściwości DatePicker onSelect JQuery.
Cieszyć się :)
http://jsfiddle.net/yechezkelbr/nUdYH/
źródło
Myślę, że można to zrobić znacznie łatwiej:
<input data-bind="value: myDate, datepicker: myDate, datepickerOptions: {}" />
Nie potrzebujesz więc ręcznej obsługi zmian w funkcji init.
Ale w tym przypadku zmienna „myDate” otrzyma tylko widoczną wartość, a nie obiekt Date.
źródło
Alternatywnie możesz określić to w wiążącej:
Aktualizacja:
źródło
Opierając się na rozwiązaniu Ryana, myDate zwraca standardowy ciąg daty, który nie jest idealny w moim przypadku. Użyłem date.js do przeanalizowania wartości, aby zawsze zwracała żądany format daty. Spójrz na ten przykład Przykład skrzypiec .
źródło
Musiałem wielokrotnie aktualizować moje dane z serwera, ale nie do końca ukończyłem zadanie, aby udostępnić moje potrzeby poniżej (mój format daty / Data (1224043200000) /):
Po poprawnym sformatowaniu modelu do wyjścia dodałem szablon z dokumentacją knockoutjs :
źródło
Niewiele osób prosiło o opcje dynamicznego wyboru daty. W moim przypadku potrzebowałem dynamicznego zakresu dat - więc pierwsze wejście określa minimalną wartość drugiego, a drugie ustawia maksymalną wartość dla pierwszego. Rozwiązałem to rozszerzając handler RP Niemeyera. A więc do jego oryginału:
Dodałem jeszcze dwa moduły obsługi odpowiadające opcjom, które chciałem zmodyfikować:
I użyłem ich w ten sposób w moim szablonie:
źródło
Korzystanie z niestandardowych powiązań podanych w poprzednich odpowiedziach nie zawsze jest możliwe. Wywołanie
$(element).datepicker(...)
zajmuje sporo czasu, a jeśli masz np. Kilkadziesiąt, a nawet setki elementów, z którymi możesz wywołać tę metodę, musisz to zrobić „leniwie”, czyli na żądanie.Na przykład model widoku może zostać zainicjowany, plik
input
a elementy zostaną wstawione do DOM, ale odpowiadające im datepickery zostaną zainicjowane tylko wtedy, gdy użytkownik je kliknie.Oto moje rozwiązanie:
Dodaj niestandardowe powiązanie, które umożliwia dołączenie dowolnych danych do węzła:
Użyj wiązania, aby dołączyć obserwowalne używane dla
input
wartości:I na koniec, inicjując datepicker, użyj jego
onSelect
opcji:W ten sposób za każdym razem, gdy użytkownik zmieni datę za pomocą selektora dat, odpowiednia obserwowalna obserwacja Knockout jest również aktualizowana.
źródło