我遇到一個問題,它將由.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