Mapeo de una matriz JSON con complemento de mapeo de knockout.js y ver renderizado no funciona

StackOverflow https://stackoverflow.com/questions/8344573

  •  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!

¿Fue útil?

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 llamo ko.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 del viewModel creación.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top