Late observable-array binding in KnockoutJS
我的MVC剃刀视图呈现此标记:
1 2 3 4 5 6 | function existingNamingsViewModel() { var self = this; var initialData = @Html.Raw(new JavaScriptSerializer().Serialize(Model)); self.ExistingNamings = ko.observableArray(initialData); } ko.applyBindings(new existingNamingsViewModel(), document.getElementById("namings-control")); |
转换为正确的JS序列化代码,并将
1 | var initialData = [{"TypeName":"Orders","NameBlocks":["{intInc_G}","/","{intInc_D}","/02/-","{yy}"],"ParamBlocks":["2296","","1","",""]}]; |
应用ko绑定后,生成的html采用可编辑网格的形式:
每当用户在这些输入字段中更改数据时,我都需要用基因敲除JS自动更新视图模型。但是由于视图模型是从简单的JSON对象初始化的,因此
P.S。一种想法是进行更复杂的初始化,其中剃须刀仅序列化
有一个映射插件可以为您解决问题,尽管您可能需要更改数据的传输方式。
映射插件提供了将JSON对象映射到视图模型的功能:
1 | var viewModel = ko.mapping.fromJS(data); |
不过请注意,在文档中(链接至上文),JSON对象内的所有属性均已命名。
示例中提供的
此外,
假设您可以采用以下格式传送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var initialData = { "TypeName":"Orders", "NameBlocks": [ {"block":"{intInc_G}"}, {"block":"/"}, {"block":"{intInc_D}"}, {"block":"/02/-"}, {"block":"{yy}"} ], "ParamBlocks":[ {"block":"2296"}, {"block":""}, {"block":"1"}, {"block":""}, {"block":""} ] }; |
然后创建视图模型将非常简单,如下所示:
1 2 3 4 5 | var viewModel = ko.mapping.fromJS(initialData); $(function() { ko.applyBindings(viewModel); }); |
这是我设置的小提琴,因此您可以在实际中看到它:http://jsfiddle.net/jimmym715/qUjLQ/
希望您的解决方案将像更改一些数据格式和使用映射插件一样简单。
无论如何,映射插件都应该向正确的方向发送信息。