【发布时间】:2014-08-05 17:22:13
【问题描述】:
我正在从来自服务器的 JSON 创建一个可观察数组。
var ViewModel = function (data) {
var self = this;
self.list = ko.observableArray(data);
self.selected = ko.observable();
}
我可以将属性与我的 UI 绑定
<form data-bind="with: selected">
<input type="text" data-bind="value: Name">
<button type="submit" class="btn btn-primary" data-bind="click: $root.create">Save</button>
</form>
我还有一个点击编辑方法,将所选对象放入selected
self.edit = function (o) {
self.selected(o);
}
遍历列表的代码:
<tbody data-bind="foreach: list">
<tr>
<td data-bind="text: Name"></td>
<td><button data-bind="click: $root.edit">edit</button></td>
</tr>
</tbody>
创建代码如下:
self.create = function (formElement) {
$(formElement).validate();
if ($(formElement).valid()) {
$.post(baseUri, $(formElement).serialize(), null, "json")
.done(function (o) {
self.list.push(o);
});
}
}
那么如何使用相同的表单来添加对象呢?我对表单上的数据绑定有点困惑。如果不选择对象,我无法显示表单。
从我看到的所有示例来看,我似乎必须创建一个带有硬编码属性的 ViewModel。我不想这样做,因为我有很多具有许多属性的视图。最好的方法是什么?
更新
这正是我所需要的:CRUD,但 ViewModel 是从 JSON 生成的,我不必手动创建它。
【问题讨论】:
-
你能设置一个 JSFiddle 什么的吗?我不太明白你的问题或问题
-
看看knockout mapping插件自动在viewmodel上创建可观察属性:knockoutjs.com/documentation/plugins-mapping.html
-
您需要一个
Add按钮作为“选择”,它将新项目传递到selected。然后可以在edit表单中设置新项目的属性。 -
@WayneEllery - 将 JSON 传递给
observableArray()会做同样的事情,而无需为所有属性创建 observables。 -
@Origineil - 我有一个添加按钮。在点击事件中,如何创建一个类似于我在 JSON 中得到的对象?
标签: javascript jquery knockout.js