我已经尝试了几天让Knockout每次在一行人员列表中更改“邮政编码”值时都会举起一个事件。我尝试了各种方法来实现这种行为,但似乎无法做到这一点。目前,这是我的Html: -
<table>
<thead>
<tr>
<th>First name</th>
<th>Last Name</th>
<th>Age</th>
<th>Zip Code</th>
</tr>
</thead>
<tbody data-bind="foreach: people">
<tr>
<td data-bind="text: firstName"></td>
<td data-bind="text: lastName"></td>
<td data-bind="text: age"></td>
<td ><input id="zipCodInput" data-bind="value: zipCode" /></td>
</tr>
</tbody>
</table>
</body>
这是填充表格的脚本: -
<script>
jQuery(document).ready(function () {
// Ultimately will come from an Ajax call
//var result = $.ajax({
// type: "GET",
// url: "/api/Resource",
// async: false
//}).responseText;
// Hard coded array for testing
var result = [{ "firstName": "Jimmy", "lastName": "Smith", "age": "43", "zipCode": "" },
{ "firstName": "John", "lastName": "Jones", "age": "23", "zipCode": "" },
{ "firstName": "Sarah", "lastName": "Palmer", "age": "26", "zipCode": "GH7HU" },
{ "firstName": "Fred", "lastName": "Smith", "age": "34", "zipCode": "" },
{ "firstName": "Simon", "lastName": "Davis", "age": "53", "zipCode": "" }];
function viewModel() {
var myArray = ko.observableArray(result);
myArray.subscribe(function (changes) {
console.log(changes);
}, null, "arrayChange");
people = myArray;
};
ko.applyBindings(new viewModel());
});
</script>
它正确绑定数据,但在编辑页面上的邮政编码行时,我从未收到任何更改。知道如何修改或重写代码以便能够捕获这些更改吗?
最终我想只将更改的行添加到json数组中以回发服务器端。
谢谢。
答案 0 :(得分:5)
默认情况下,您不会在observableArray级别获取通知。之所以observableArray只关注它的目录中的项目,而不关心这些项目的属性是否在变化。
如果您想观察更改,可以执行此操作 -
var myArray = ko.observableArray(result);
ko.utils.arrayForEach(myArray(), function (thisItem) {
thisItem.subscribe(function (changes) {
console.log(changes);
});
});
people = myArray;
这将订阅observableArray中的每个单独对象,并在该对象上的属性发生更改时触发。
答案 1 :(得分:0)
如果数组本身发生了变化,这将有效,但是为了跟踪数组内对象的更改,你应该有一个可观察数组......
Knockout网站上的这个例子可以帮助你:
http://knockoutjs.com/examples/contactsEditor.html