【发布时间】:2014-05-07 10:36:09
【问题描述】:
两周以来我一直在研究 KnockoutJS,我正在尝试使用 KnockOutJS 和 jQuery 在网格中添加内联编辑。我的html:
<table>
<thead>
<tr>
<th>ID</th>
<th>Title</th>
<th>Excerpts</th>
<th>Content</th>
</tr>
</thead>
<tbody data-bind="foreach: Articles">
<tr>
<td data-bind="text: id"></td>
<td data-bind="text: Excerpts, event: { dblclick: $root.editField }"></td>
<td data-bind="text: Excerpts, event: { dblclick: $root.editField }"></td>
<td data-bind="text: Content, event: { dblclick: $root.editField }"></td>
</tr>
</tbody>
我的 JS:
function Articles(Articles) {
this.id = ko.observable(Articles.id);
this.Title = ko.observable(Articles.Title);
this.Excerpts = ko.observable(Articles.Excerpts);
this.Content = ko.observable(Articles.Content);
}
var ViewModel = {
Articles: ko.observableArray
([new Articles(id = 1, Title = "Title1", Excerpts = "Excerpts1", Content = "Content1")]),
loadArticles: function () {
var self = this;
self.Articles(Articles);
},
editField: function (d, e) {
var currentEle = $(e.target);
var value = $(e.target).html();
$(currentEle).html('<input class="thVal" type="text" value="' + value + '" />');
$(currentEle).find('input').focus();
$(currentEle).find('input').keyup(function (event) {
if (event.keyCode == 13) {
$(currentEle).html($(currentEle).find('input').val().trim());
//CallAjaxWithData('/MTB_Articles/EditArticle', 'POST', ko.toJSON(d), null, null); // To update data in server
}
});
$(document).click(function () {
if ($(currentEle).find('input').val() != null) {
$(currentEle).html($(currentEle).find('input').val().trim());
//CallAjaxWithData('/MTB_Articles/EditArticle', 'POST', ko.toJSON(d), null, null); // To update data in server
}
});
}
}
ko.applyBindings(ViewModel);
ViewModel.loadArticles();
每当用户双击网格中的任何 td 时,我都会使用 editField 函数动态添加一个输入字段,并在用户按下回车键或单击其他位置时再次将更新后的值绑定到 td页。 editField 函数中的参数d 给出了当前视图模型对象。当用户编辑特定列中的值时,我必须更新参数d 中的相应值,将d 转换为json 格式并通过ajax 调用将其发送到服务器以在数据库中更新。用户所做的更改应反映在视图模型中(参数d)。那么我们如何使用动态添加的控件来更新视图模型呢?
【问题讨论】:
-
在这里试试这个小提琴:jsfiddle.net/ADttL/24 应该做你需要的
标签: javascript jquery html knockout.js