he encontrado la solución a este problema no es realmente satisfactoria. Aunque el enfoque es bastante interesante, falla cuando el usuario elige la cuenta más adelante y el navegador permite usar las credenciales almacenadas (por ejemplo, si hay más de una credencial almacenada). También falló cuando comenzó a escribir la contraseña y se eliminó para volver a la contraseña original (al menos en Firefox). Además, realmente no me gustó el tiempo de espera para darle tiempo al navegador, simplemente no es tan bueno.
Mi solución: que no es realmente una, pero pensé que comparto, no obstante
actualización de nuestro modelo simple de forma manual antes de hacer el login en la devolución de llamada presentar. Usando jQuery, algo así como self.password($("#password").val())
debería hacerlo.
De forma alternativa, al usar los enlaces existentes, la activación de un evento de cambio también parece funcionar, p. Ej. $("#password").change()
.
Los Pros:
- es sólo para los campos de credenciales, por lo que, probablemente, una cosa de tiempo para su sitio
- es sencillo y limpio - una o dos líneas en el lugar adecuado
- parece siempre funcionar de forma fiable, independientemente del navegador, la configuración de credenciales o patrón de uso
Los contras:
- se rompe una vez más la buena separación Knockout.js proporciona
- no es una solución sino más bien una solución
voy a seguir con eso por ahora, porque lo encontré trabajo simplemente fiable. Sería bueno decirle a Knockout que reevalúe los enlaces directamente en lugar de almacenar el valor de nuevo manualmente o desencadenarlo a través del evento de cambio. Pero no he encontrado nada hasta ahora.
Simplemente pensando un poco más adelante - el mismo problema debería surgir cuando el navegador completa automáticamente cualquier forma (ej. Como una dirección) - lo que significa que algún tipo de función general haciendo lo anterior sería agradable (probablemente llamando al gatillo de cambio en cada campo de entrada del formulario)
Editar: Algunos código rápido que demuestra la idea
el HTML:
<form id="myForm" data-bind="submit: login">
Email: <input type="text" data-bind="value: email" /><br/>
Password: <input type="password" data-bind="value: password" /><br/>
<button type="submit">Login</button>
</form>
Y el Javascript:
function ViewModel() {
var self = this;
self.email = ko.observable("");
self.password = ko.observable("");
self.login = function() {
$("#myForm").find("input").change();
//Now the observables contain the recent data
alert(ko.mapping.toJSON(self));
};
}
Knouckout.js necesita para manejar el evento 'input'. – SLaks