私はこのビューモデルを持っています:
var contactsViewModel = {
contacts: ko.mapping.fromJS([])
};
次のように入力されます。
ko.mapping.fromJS(contactsData, dataMappingOptions, contactsViewModel.contacts);
ko.applyBindings(contactsViewModel);
マッピングは contactItem モデルから取得されます
var dataMappingOptions = {
key: function (data) {
return data.id;
},
create: function (options) {
return new contactItem(options.data);
}
};
これで、ビュー モデルに追加する selectedItem メソッドができました。
contactsViewModel.selectedItem = ko.observable();
したがって、追加、削除、編集などを行うことができます。ただし、呼び出し時にキャンセルする場合:
contactsViewModel.cancel = function () {
contactsViewModel.selectedItem(null);
console.log(contactsViewModel.selectedItem());
};
コンソールに null が表示されますが、編集していたアイテムには最新の変更が表示されます!!? :(
見たい場合のその他のスニペット:
var contactItem = function (data) {
var self = this;
self.id = ko.observable(data.id);
self.email = ko.observable(data.email);
self.firstName = ko.observable(data.firstName);
self.lastName = ko.observable(data.lastName);
self.company = ko.observable(data.company);
self.reportsURL = ko.computed(function () {
return "#/reports/contact/" + self.id;
});
// validations:
ko.validation.configure({
insertMessages : false
});
self.email.extend({
required: true,
email: true
});
self.firstName.extend({ required: true });
self.lastName.extend({ required: true });
self.company.extend({ required: true });
self.errors = ko.validation.group(self);
};
そして私の編集方法:
contactsViewModel.edit = function (contact) {
contactsViewModel.selectedItem(contact);
};
そして、このキャンセルを持つテンプレート:
<script type="text/html" id="edit">
<td class="editMode">
<input class="span3 animated fadeInDown" data-bind="value: email, validationAlert : email " />
</td>
<td class="editMode">
<input class="span2 animated fadeInDown" data-bind="value: firstName, validationAlert : firstName " />
</td>
<td class="editMode">
<input class="span2 animated fadeInDown" data-bind="value: lastName, validationAlert : lastName " />
</td>
<td class="editMode">
<input class="span2 animated fadeInDown" data-bind="value: company, validationAlert : company " />
</td>
<td class="editMode">
<ul class="rowOptions">
<li><a href="#" data-bind="click: $parent.save" title="Save your edits">Save<i class="icon-ok"></i></a></li>
<li><a href="#" data-bind="click: $parent.cancel" title="Cancel editing">Cancel<i class="icon-remove-circle"></i></a></li>
</ul>
</td>
</script>