关于javascript:KnockoutJS中的后期可观察数组绑定

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序列化代码,并将initialData变量初始化为:

1
var initialData = [{"TypeName":"Orders","NameBlocks":["{intInc_G}","/","{intInc_D}","/02/-","{yy}"],"ParamBlocks":["2296","","1","",""]}];

应用ko绑定后,生成的html采用可编辑网格的形式:
enter

1
var viewModel = ko.mapping.fromJS(data);

不过请注意,在文档中(链接至上文),JSON对象内的所有属性均已命名。

示例中提供的initialData包含的数组只是值的集合,而不是命名值的集合。

此外,initialData是一个包含单个对象的数组。如果这种情况总是希望有一个对象,那么此解决方案会更容易。

假设您可以采用以下格式传送initialData

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/

希望您的解决方案将像更改一些数据格式和使用映射插件一样简单。

无论如何,映射插件都应该向正确的方向发送信息。