2012-03-01 2 views
25

Nie jestem pewien, czy jest to możliwe, ale mam scenariusz, gdzie mam system weryfikacji, który powiadamia mój system sprawdzania poprawności, gdy coś stało się ważne/nieważne poprzez zależną obserwowalne. Teraz działa to świetnie, gdy użytkownik wypełnia formularz, ponieważ dependantObservable jest wyłączany z powodu zmiany wartości obserwowanych obiektów. (tj. jeśli właściwość Name ulegnie zmianie, to ponownie przeanalizuje zależną obserwowalność isValid, która z kolei powiadomi moje powiązanie, które zostanie podłączone do systemu walidacji).Ręcznie dostać nokaut, aby ponownie ocenić dependantObservable

Moim problemem jest to, że jeśli użytkownik w ogóle nie dotknie formularza i po prostu przejdzie od razu do zgłoszenia, nie wywoła to wiązania, ponieważ wartości bazowe nie uległy zmianie w przypadku obserwowalnych elementów, więc żaden subskrybent nie będzie wiedział o wszelkich zmianach walidacyjnych. Idealnie nie chcę przechodzić przez każdą obserwowalną i ponownie przypisać jej bieżącej zmiennej, aby popchnąć ocenę sprawdzania poprawności, która z kolei wywoła zmianę stanu sprawdzania poprawności. Więc tak naprawdę wszystko, co chcę zrobić, to uzyskać isValid dependantObservable na odświeżenie z braku lepszego słowa.

Wydaje się dość paskudny tak czy inaczej, ale moje opcje wydają się być:

1) wymuszają zmianę wartości na wszystkich obserwabli są sprawdzane przed (okropny) 2) Siła ponowną ocenę IsValid dependantObservable aby wywołać abonenta (mniej straszne, ale nadal źle) 3) ponownie napisać bibliotekę walidacji narazić forceValidation() funkcję, która jakoś wyzwolić wszystko, aby zostać poddane ponownej ocenie, pomijając konieczność dla obserwabli bazowych do wyzwalania rurociągu walidacji.

Wszelkie pomysły?

Odpowiedz

49

Na podstawie obliczenia obserwowalnego (isValid) można zadzwonić pod numer notifySubscribers(currentValue), który powiadomi abonentów o bieżącej wartości. Nie będzie ponownej oceny obliczonych i po prostu powiadomi subskrybentów o bieżącej wartości.

+0

Oh genialny, powiedziano mi też, że '' notifySubscribers (CurrentValue) '' woudl wykonać zadanie, ale jeśli ten nie wymaga najpierw przeczytać, że jest to lepsze rozwiązanie. dzięki! – Grofit

+0

valueHasMutated wyśle ​​bieżącą wartość przechowywaną wewnętrznie w obserwowalnym, podczas gdy notifySubscribers wyśle ​​dowolną wartość, którą przekazujesz jako pierwszy argument (co wymagałoby odczytania aktualnej wartości w twoim przypadku). –

+10

@RPNiemeyer Czy coś się zmieniło w sposobie, w jaki to działa? W wersji 2.3.0 pojawia się błąd 'Object ... nie ma wartości 'valueHasMutated'', natomiast wywoływanie' myComputed.notifySubscribers (myComputed()) 'nie daje mi takiego błędu ... – ach

4

Dodaj wiążące enable: formValid gdzie formValid = ko.computed(return true if all values are valid) na przycisk Prześlij. W ten sposób użytkownik nie może przesłać, dopóki formularz nie zostanie wypełniony prawidłowo.

Zastosowanie ko.validation.validateObservable(yourDependentObservable) do revalidate polu ręcznie

lub użyj yourObsevable.notifySubscribers() jeśli yourDependentObservable zależy yourObservable.