2011-12-01 56 views
3

我遇到一个问题,它将由.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阵列上的所有属性映射,以使他们观察到的更新我的看法,但它是不工作。

任何想法?先谢谢你!

+0

开始为什么你使用'HtmlString'?简单的'<%:ViewBag.OrderProposals%>'应该就足够了。其次,改变'observableArray'中任何项的值都不会再次渲染模板。 'observableArray'只能观察数组中的添加/删除操作,而不会修改其中的各个项目。 – neebz

+0

@nEEbz:好的,我所做的假设是错误的。我如何检测变化?我应该使用updateFromJS吗? – jmpcm

+0

不是'ko.mapping.fromJSON(<%:PROPOSAL STUFF%>);'完全静态呈现/由ASP内联生成?换句话说,在编译时不需要ko.mapping.fromJSON,也就是说,如果您在运行时动态填充'intialdata',则只需要它。 – Barry

回答

5

终于解决了!最后的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); 

的这两个变化我做:的

  • 代替ko.mapping.fromJSON(initialData)我打电话ko.mapping.fromJS(initialData)。不舒服,但我似乎.fromJSON()有一些问题映射我提出的问题;
  • .fromJS()方法在viewModel创建后被调用。
+0

我认为从JSON不起作用,因为当你从HtmlString创建你的JavaScript字符串时,你会收到一个没有编码的字符串,这被认为是一个有效的JavaScript对象,但不是有效的JSON。要获得有效的JSON对象,您将不需要使用HtmlString,但在这种情况下,您将遇到一些需要解析的残缺字符的问题。我认为使用fromJSON的唯一原因是,当您进行ajax调用时,将从服务器返回有效的JSON流。另一种方法可能是将initialData转换为JSON。 – Samuel