I piense que la solución a su problema proviene de pensar en el modelo de vista de la manera incorrecta. Un modelo de vista no solo es algo que entrega datos a la vista, sino también un marcador de posición para volver a enviar los datos.
La forma en que suelo terminar trabajando con knockout, nunca termino enviando un modelo de vista vacía a la vista. El modelo de vista generalmente tiene todos los campos a los que me estoy vinculando. Si bien pueden ser cadenas vacías, o objetos inicializados sin valores de visualización, los objetos reales salen aún, con una representación adecuada de cada objeto en los campos a los que me estoy vinculando.
Es posible que desee considerar simplemente enviar objetos vacíos en lugar de nada a la vista.
EDIT: El ejemplo es la ONU ASP.NET MVC
Así basiclaly, i en el lado del servidor, i crear un objeto vista del modelo, que contiene todos los datos que hay que mostrar, así como todos los datos eso necesita ser recolectado Para obtener un código de validación más sencillo, generalmente pongo los datos que se recopilarán en su propia subclase, pero esa es una cuestión de las necesidades de su código.
En cualquier caso, cualquier objeto que vaya a la vista se ejecuta desde una clase vmBase que básicamente proporciona un método toJSON() que genera la serialización JSON del objeto. Esto se llama en mi opinión por el motor de vista. Como se muestra en el código a continuación.
<script type='text/javascript'>
var viewModel = ko.mapping.fromJS(<%= Model.ToJson() %>);
$(document).ready(function() {
ko.applyBindings(viewModel);
});
</script>
cuando esté listo para enviar el código de copia de seguridad, simplemente se quita tirar una versión JS del modelo de vista.
<script type='text/javascript'>
var dataToSendToServer = ko.toJS(viewModel);
</script>
En algunos sanarios, donde sólo una parte del modelo de visión está cambiando (esto es si usted está haciendo cambios AJAX), usted puede hacer algunas cosas interesantes como, plantillas de conmutación de modo tan diferente de unión puede ser applyed. En este caso estamos usando un #ID_of_Container como contenedor de los datos originales/plantilla y la sustitución de la plantilla (que puede contener datos-bind = "" elementos) una nueva plantilla ID_of_Template
<script type='text/javascript'>
ko.cleanNode($("#ID_of_Container"));
delete (viewModel.Some_Element_To_Be_Updated);
viewModel = ko.mapping.updateFromJS(viewModel, New_Data_For_That_Element);
// Use ko.toJS(viewModel) because standard template plugin doesn't understand
// knockout observables
$("#ID_of_Container").html($("#ID_of_Template").tmpl(ko.toJS(viewModel)))
ko.applyBindings(viewModel, $("#ID_of_Container")[0]);
</script>
Gracias RP Niemeyer, voy a probar esto en los próximos días. ¡Suena prometedor! – MichaelvR
El enlace personalizado funciona perfectamente, ¡gracias! – MichaelvR
el enlace de cust init funcionó muy bien para mí, pero no me gustó la actualización dinámica del atributo de enlace de datos en el enlace, así que sugiero usar [elementos de virual] (http://knockoutjs.com/documentation/custom-bindings -for-virtual-elements.html). \t \t Algo así como: <- ko valueWithInit: 'propC' -> –