Отображение массива JSON с помощью подключаемого модуля knockout.js & и отображение представления не работает - PullRequest
3 голосов
/ 01 декабря 2011

У меня проблема с отображением массива JSON, сгенерированного .NET JavaScriptSerializer, в knockout.js. Массив создается следующим образом (для простоты сокращен):

OrderProposalFacade[] proposals = new OrderProposalFacade[order.OrderProposals.Count];

foreach (OrderProposal proposal in order.OrderProposals)
{
    proposals[i++] = new OrderProposalFacade(proposal);
}

ViewBag.OrderProposals = new JavaScriptSerializer().Serialize(proposals);

Сгенерированная строка JSON выглядит примерно так:

[{ "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}
]

В представлении ASP.NET MVC я делаю это для привязки массива:

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);

Проблема: массив proposals должен отображаться шаблоном knockout.js, но ничего не отображается. Используя Firebug, я не вижу никаких объектов в массиве initialData, поэтому я предполагаю, что при его инициализации произошла ошибка и, следовательно, proposals. Привязка к шаблону выглядит так:

<div id="service-orders" data-bind='template: { name: "proposal-template", foreach: proposals }' style="margin:0 -.7em 0 -0.5em;"></div>

Если я удаляю ko.mapping.fromJSON(), все работает нормально, то есть шаблон отображается со значениями в массиве proposals. Но возникает другая проблема, когда я обновляю значение объекта в массиве initialData. Насколько я понимаю, если я обновлю наблюдаемое свойство, шаблон будет визуализирован снова (следовательно, отображение knockout.js), но без отображения всех свойств этого не произойдет, верно?

Короче , мне нужно отобразить все свойства в массиве initialData, чтобы сделать их видимыми для обновления моего представления, когда я изменяю значение одного из его объектов, но это не так т работает.

Есть идеи? Заранее спасибо!

1 Ответ

5 голосов
/ 05 декабря 2011

Наконец-то решил! Окончательный Javascript выглядит так:

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);

2 изменения, которые я сделал:

  • вместо ko.mapping.fromJSON(initialData) я звоню ko.mapping.fromJS(initialData). Не уверен, но мне кажется, что .fromJSON() имеет некоторые проблемы с отображением массива, который я поставил на вопрос;
  • метод .fromJS() вызывается после создания viewModel.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...