0

我有一个用于创建表单的 JSON 对象。这个 JSON 对象由 KnockoutJS 解析。

现在,当我修改表单时,我希望根据表单中所做的修改来更新 JSON 对象。问题是我事先不知道表单会是什么样子,但我知道 JSON 对象中哪些字段需要更新。

我真的不知道最好的方法是什么。我知道每次发生变化时我都可以重建 JSON 对象,但这似乎是一个坏主意和一个乏味的过程。

有没有一种简单的方法可以将每个 JSON 对象字段映射到 KnockoutJS 中的项目?

这是我目前正在做的 JSFiddle:http: //goo.gl/ZBaV7

更新 :

我意识到这一行很有趣:

<input type="text" data-bind="value: $data.value, attr : { disabled: $data.disabled }" />

我通过($data.value)直接从数组中访问值。html中有没有办法说敲除绑定到数组中的这个特定属性。我知道如果数组重新排序,一切都会变得一团糟,但既然我知道唯一可以改变的是这个属性,我准备好承担这个风险了吗?

换句话说,有没有办法手动说当这个值改变时在数组中改变它,例如

data-bind="onChange: $data.value = this.value"
4

3 回答 3

1

如果您的 Knockout ViewModel 与您的表单匹配,您可以使用内置的ks.toJSON()

http://knockoutjs.com/documentation/json-data.html

一个更好的选择,特别是如果您的表单很大或很复杂,是使用mappingviewmodel插件

http://knockoutjs.com/documentation/plugins-mapping.html http://coderenaissance.github.io/knockout.viewmodel/

于 2013-06-20T18:20:47.670 回答
1

有没有一种简单的方法可以将每个 JSON 对象字段映射到 KnockoutJS 中的项目?

是的,如果我理解您想要正确执行的操作。到目前为止,您的视图模型中的值不是可观察的,并且不会随着表单值的变化而自动更新。有一个插件来处理这个映射。

http://knockoutjs.com/documentation/plugins-mapping.html

示例:使用 ko.mapping

要通过映射插件创建视图模型,请将上面代码中 viewModel 的创建替换为 ko.mapping.fromJS 函数:

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

这会自动为数据上的每个属性创建可观察的属性。然后,每次从服务器接收到新数据时,您可以通过再次调用 ko.mapping.fromJS 函数一步更新 viewModel 上的所有属性:

ko.mapping.fromJS(data, viewModel);

希望这会有所帮助。

于 2013-06-20T19:07:56.780 回答
0

将您的 json 模型转换为可用的淘汰模型的最简单方法是使用映射插件。

或者,您可以手动将 json 模型中的字段复制到ko.observable视图模型的成员中,从而为您提供更多控制权并让您选择跳过只读属性。

于 2013-06-20T18:21:21.283 回答