Mapeo de una matriz JSON con complemento de mapeo de knockout.js y ver renderizado no funciona
-
27-10-2019 - |
Pregunta
Tengo problemas para asignar una matriz JSON generada por .NET JavaScriptSerializer
, a knockout.js. La matriz se genera así (acortada para facilitar):
OrderProposalFacade[] proposals = new OrderProposalFacade[order.OrderProposals.Count];
foreach (OrderProposal proposal in order.OrderProposals)
{
proposals[i++] = new OrderProposalFacade(proposal);
}
ViewBag.OrderProposals = new JavaScriptSerializer().Serialize(proposals);
La cadena JSON generada es algo como esto:
[{ "ProposalId":1,"ProgrammedWeek":null,
"ProposalValue":120,"ProposalValueCorrected":130,
"ProposalDateSent":"01-12-2011","ProposalDateCorrected":"01-12-2011",
"ServiceId":1,"ServiceDescriptiveId":"OS001","ProposalState":2
},
{//another similar object}
]
En la vista ASP.NET MVC lo hago para unir la matriz:
var initialData = ko.mapping.fromJSON(<%: new HtmlString(ViewBag.OrderProposals as string) %>);
var viewModel = {
proposals: ko.observableArray(initialData),
//some methods; removed to ease reading
};
ko.applyBindings(viewModel);
El problema: la proposals
Se supone que la matriz debe ser presentada por una plantilla de knockout.js, pero no se presenta nada. Usando Firebug, no veo ningún objeto en el initialData
matriz, por lo que supongo que hay un error al inicializarlo y, por lo tanto, proposals
. El enlace a la plantilla es así:
<div id="service-orders" data-bind='template: { name: "proposal-template", foreach: proposals }' style="margin:0 -.7em 0 -0.5em;"></div>
Si elimino ko.mapping.fromJSON()
Todo funciona bien, es decir, la plantilla se representa con los valores en el proposals
formación. Pero surge otro problema cuando actualizo un valor de un objeto en el initialData
formación. Según tengo entendido, si actualizo una propiedad observable, la plantilla se vuelve a reproducirse (por lo tanto, el mapeo Knockout.js), pero sin mapear todas las propiedades no sucederá, ¿verdad?
En breve, Necesito mapear todas las propiedades del initialData
matriz para que sean observables para actualizar mi opinión cuando cambio un valor de uno de sus objetos, pero no funciona.
¿Algunas ideas? ¡Gracias de antemano!
Solución
¡Finalmente lo resolvió! El JavaScript final es así:
var initialData = <%: new HtmlString(ViewBag.OrderProposals as string) %>;
var viewModel = {
proposals: ko.observableArray(),
//some methods; removed to ease reading
};
viewModel.proposals = ko.mapping.fromJS(initialData);
ko.applyBindings(viewModel);
Los 2 cambios que hice:
- en vez de
ko.mapping.fromJSON(initialData)
Yo lo llamoko.mapping.fromJS(initialData)
. No shure, pero yo parece que.fromJSON()
tiene algunos problemas para mapear la matriz que me hice en la pregunta; - la
.fromJS()
el método se invoca después delviewModel
creación.