validation - La validación Knockout se evalúa inmediatamente en la carga
knockout validation live (3)
Estoy usando MVC, Knockout y Knockout Validation para validar mi modelo de vista.
Estoy encontrando un problema en el que la validación de las propiedades del modelo de vista se dispara inmediatamente después de la carga. En otras palabras, "Este campo es obligatorio" aparece junto a mis entradas antes de que un usuario haya intentado cambiar sus valores.
Este problema ocurre específicamente con los controles desplegables (selección).
Supongo que este es un problema que he creado al cambiar / acceder / mutar involuntariamente el observable en otra parte de mi código javascript. Sin embargo, no sé cómo rastrear esto.
¿Hay alguna forma de que pueda suscribirme o rastrear de alguna manera los disparos que causan la validación en la Validación de Knockout? Solo necesito saber por qué esto está disparando de la manera que es. Estoy bastante seguro de que el valor de la función isValid () es siempre falso.
Aquí hay una muestra de cómo mi HTML está configurado en la carga de la página, sin ser molestado:
<select class="highlightable validationElement" name="obsstate" data-bind="value: standardAnswers.ans106_1.value" required="true">
<option value="">-- Select -- </option>
<option value="AK">AK</option>
<option value="AL">AL</option>
etc...
</select>
Citando la página de KO .... ( http://knockoutjs.com/documentation/options-binding.html )
KO prefijará la lista de elementos con uno que muestra el texto "Seleccionar un elemento ..." y tiene el valor indefinido. Por lo tanto, si myChosenValue mantiene el valor indefinido (lo que hacen los observables por defecto), se seleccionará la opción ficticia. Si el parámetro optionsCaption es un observable, entonces el texto del elemento inicial se actualizará a medida que cambie el valor del observable.
Entonces, lo resolví configurando "indefinido" al definir la propiedad, vea el ejemplo a continuación:
self.myProperty = ko.observable(undefined).extend({
required : {"Field Required"}
});
Espero que esto ayude...
Después de aplicar los enlaces para el modelo de vista. Luego, para ese modelo de vista, haga que showAllMessages
sea false
Ejemplo
YourViewmodelname.errors.showAllMessages(false);
Me di cuenta de este problema por mi cuenta.
El problema existe entre el motor de maquinilla de afeitar y la plantilla de las opciones de selección, y luego vincular el valor del elemento seleccionado a Knockout.
A pesar de que no hay un valor ingresado por el usuario en el cuadro de selección, el valor predeterminado, "--seleccionar", en realidad contiene un valor. En mi caso era una cadena vacía. Por lo tanto, cuando apliqué los enlaces ciegos, mi propiedad viewmodel se "actualizó" con el valor de la cadena vacía y, por lo tanto, se activó la validación.
Para solucionar esto en mi caso, establezco el valor predeterminado de mi modelo como una cadena vacía. Por lo tanto, cuando se aplican los enlaces, no hay un evento valueHasMutated activado en el observable Knockout, y por lo tanto no hay validación.