連絡帳
ネストしたデータ構造を編集するかなり一般的な例です。 ViewModel はシンプル、View へのバインドは素直で簡単です。
デモ
コード: View
<h2>連絡先</h2> <div id='contactsList'> <table class='contactsEditor'> <thead> <tr> <th>ファーストネーム</th> <th>ラストネーム</th> <th>電話番号</th> </tr> </thead> <tbody data-bind="foreach: contacts"> <tr> <td> <input data-bind='value: firstName' /> <div><a href='#' data-bind='click: $root.removeContact'>削除</a></div> </td> <td><input data-bind='value: lastName' /></td> <td> <table> <tbody data-bind="foreach: phones"> <tr> <td><input data-bind='value: type' /></td> <td><input data-bind='value: number' /></td> <td><a href='#' data-bind='click: $root.removePhone'>削除</a></td> </tr> </tbody> </table> <a href='#' data-bind='click: $root.addPhone'>電話番号を追加</a> </td> </tr> </tbody> </table> </div> <p> <button data-bind='click: addContact'>連絡先を追加</button> <button data-bind='click: save, enable: contacts().length > 0'>JSON形式で保存</button> </p> <textarea data-bind='value: lastSavedJson' rows='5' cols='60' disabled='disabled'> </textarea>
コード: ViewModel
var initialData = [ { firstName: "ダニー", lastName: "ラルッソ", phones: [ { type: "携帯", number: "(555) 121-2121" }, { type: "電話", number: "(555) 123-4567"}] }, { firstName: "先生", lastName: "宮城", phones: [ { type: "携帯", number: "(555) 444-2222" }, { type: "電話", number: "(555) 999-1212"}] } ]; var ContactsModel = function(contacts) { var self = this; self.contacts = ko.observableArray(ko.utils.arrayMap(contacts, function(contact) { return { firstName: contact.firstName, lastName: contact.lastName, phones: ko.observableArray(contact.phones) }; })); self.addContact = function() { self.contacts.push({ firstName: "", lastName: "", phones: ko.observableArray() }); }; self.removeContact = function(contact) { self.contacts.remove(contact); }; self.addPhone = function(contact) { contact.phones.push({ type: "", number: "" }); }; self.removePhone = function(phone) { $.each(self.contacts(), function() { this.phones.remove(phone) }) }; self.save = function() { self.lastSavedJson(JSON.stringify(ko.toJS(self.contacts), null, 2)); }; self.lastSavedJson = ko.observable("") }; ko.applyBindings(new ContactsModel(initialData));
jsFiddle で試す /
原文はこちら