instrucciones Folliwing dadas en el documentation, I tiene la siguiente vista de modelo:bucle infinito cuando la conversión de objeto knockout a objeto JavaScript llanura
var newContactViewModel = function() {
var self = this;
self.Name = ko.observable();
self.Address = ko.observable();
self.City = ko.observable();
self.State = ko.observable();
self.PostalCode = ko.observable();
self.Save = function() {
$.ajax({
type: "POST",
url: "/contact",
data: ko.toJS(self), //infinite loop here
success: state.OnSaved
});
};
};
Cuando se llama al método self.Save
, se produce un bucle infinito. Chrome realidad informa del error como:
Uncaught RangeError: Maximum call stack size exceeded
Si uso ko.mapping.toJS(self)
en lugar de ko.toJS(self)
, cuando me siento un error poco más revelador, pero no "mensaje" de error real:
Si yo intercambie ko.toJS(self)
con algo como { Name: self.Name(), Address: self.Address() /* etc */ }
, entonces todo funciona bien. Parece que está intentando convertir el método Save
y volver a llamar al método como resultado.
Hay un error en KnockoutJS o hay un problema cuando lo uso. Prefiero lo último. ¿Pensamientos?
Eso es realmente información útil, porque yo estaba teniendo problemas con modelos Backbone donde estaba añadiendo una gran cantidad de referencias a las colecciones de los padres, etc. Sin embargo, esto es sólo una solución real, creo que, si está haciendo manualmente la conversión. No ayuda si ko.toJS se usa internamente en otro código de biblioteca. – neverfox
buena solución para una decisión de diseño completamente desastrosa. Lo que francamente me enfurece en este momento es que no me di cuenta de este comportamiento durante meses y esencialmente se deja como 'por diseño' https://github.com/knockout/knockout/pull/1079 - esto necesita ser configurable –