2011-12-01 50 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