2012-03-01 14 views
25

No estoy seguro si esto es posible, pero tengo un escenario donde tengo un sistema de validación que notifica a mi sistema de validación cuando algo se ha convertido en válido/inválido a través de un observable dependiente. Ahora esto funciona muy bien cuando un usuario está completando un formulario, ya que dependdantObservable se aleja del valor de los valores observables subyacentes. (es decir, si la propiedad Nombre cambia, volverá a evaluar el isValid dependiente observable, que a su vez notificará mi enlace que se engancha en el sistema de validación).Obtener nocaut manualmente para volver a evaluar un dependienteObservable

Ahora mi problema es que si el usuario no toca el formulario y simplemente va directo al envío, no activará el enlace, ya que los valores subyacentes no han cambiado para ningún elemento observable, por lo que ningún suscriptor sabrá sobre cualquier cambio de validación que esté sucediendo. Idealmente, no quiero pasar por cada elemento observable y volver a asignarle su variable actual para impulsar una evaluación de validación, lo que a su vez desencadenaría un cambio en el estado de validación. Entonces, como realmente todo lo que quiero hacer es obtener este isValid dependdantObservable a actualizar por falta de una palabra mejor.

parece bastante desagradable de cualquier manera, pero mis opciones parecen ser:

1) forzar un cambio de valor en todos los observables ser validados en contra (horrible) 2) Fuerza una re-evaluación de la isValid dependantObservable para activar el suscriptor (menos horrible, pero aún malo) 3) Vuelva a escribir la biblioteca de validación para exponer una función forceValidation() que de alguna manera provocaría que todo se vuelva a evaluar, evitando la necesidad de que los observables subyacentes activen la canalización de validación.

¿Alguna idea?

Respuesta

49

En su observable calculado (isValid) puede llamar al notifySubscribers(currentValue), que notificará a los suscriptores con el valor actual. No volverá a evaluar el cálculo y simplemente notificará a los suscriptores con el valor actual.

+0

Oh, genial, también me dijeron que '' notifySubscribers (currentValue) '' haría el trabajo, pero si este no requiere la lectura primero, es una mejor solución. ¡Gracias! – Grofit

+0

valueHasMutated enviará el valor actual almacenado internamente en el observable, mientras que notifySubscribers enviará cualquier valor que pase como primer arg (que requeriría que lea el valor actual en su caso). –

+10

@RPNiemeyer ¿Ha cambiado algo con respecto a la forma en que esto funciona? En 2.3.0 aparece el error 'Objeto ... no tiene el método 'valueHasMutated'', mientras que llamar' myComputed.notifySubscribers (myComputed()) 'no me da ese error ... – ach

4

Agregar vinculante enable: formValid donde formValid = ko.computed(return true if all values are valid) enviar botón. De esta forma el usuario no puede enviar hasta que el formulario se haya llenado correctamente.

Uso ko.validation.validateObservable(yourDependentObservable) a revalidar el campo manualmente

o utilizar yourObsevable.notifySubscribers() si yourDependentObservable depende de yourObservable.

Cuestiones relacionadas