我遇到一个问题,它将由.NET JavaScriptSerializer
生成的JSON数组映射到knockout.js。该阵列是这样产生的(缩短为便于):用knockout.js映射插件&映射JSON数组并且查看渲染不起作用
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
阵列上的所有属性映射,以使他们观察到的更新我的看法,但它是不工作。
任何想法?先谢谢你!
开始为什么你使用'HtmlString'?简单的'<%:ViewBag.OrderProposals%>'应该就足够了。其次,改变'observableArray'中任何项的值都不会再次渲染模板。 'observableArray'只能观察数组中的添加/删除操作,而不会修改其中的各个项目。 – neebz
@nEEbz:好的,我所做的假设是错误的。我如何检测变化?我应该使用updateFromJS吗? – jmpcm
不是'ko.mapping.fromJSON(<%:PROPOSAL STUFF%>);'完全静态呈现/由ASP内联生成?换句话说,在编译时不需要ko.mapping.fromJSON,也就是说,如果您在运行时动态填充'intialdata',则只需要它。 – Barry