グリッドエディタ
foreach
バインディングを使って、配列の各アイテムにしたがって内容を表示する例です。
アイテムを追加・削除しても、Knockout ではすべてを再レンダリングせずに済みます。
新たなアイテムに応じたエレメントのみがレンダリングされます。
これは、他のリッチ UI コントロール (Validatorなど) の状態が保たれることを意味します。
このサンプルのビルドおよび ASP.NET MVC との統合に関する詳細なステップバイステップのチュートリアルについては、 このブログの記事 を参照してください。
デモ
コード: View
<form action='/someServerSideHandler'> <p>欲しいものリスト: <span data-bind='text: gifts().length'> </span> 点</p> <table data-bind='visible: gifts().length > 0'> <thead> <tr> <th>名前</th> <th>価格</th> <th /> </tr> </thead> <tbody data-bind='foreach: gifts'> <tr> <td><input type="text" class='required' data-bind='value: name, uniqueName: true' /></td> <td><input type="text" class='required number' data-bind='value: price, uniqueName: true' /></td> <td><a href='#' data-bind='click: $root.removeGift'>削除</a></td> </tr> </tbody> </table> <button data-bind='click: addGift'>追加</button> <button data-bind='enable: gifts().length > 0' type='submit'>登録</button> </form>
コード: ViewModel
var GiftModel = function(gifts) { var self = this; self.gifts = ko.observableArray(gifts); self.addGift = function() { self.gifts.push({ name: "", price: "" }); }; self.removeGift = function(gift) { self.gifts.remove(gift); }; self.save = function(form) { alert("次のようにサーバに送信できます: " + ko.utils.stringifyJson(self.gifts)); // ここで通常のフォーム送信同様に送信する場合、次のように書いてください: // ko.utils.postJson($("form")[0], self.gifts); }; }; var viewModel = new GiftModel([ { name: "高帽子", price: "39.95"}, { name: "長いクローク", price: "120.00"} ]); ko.applyBindings(viewModel, document.getElementById('demo_1')); // jQuery Validation を起動 $("form").validate({ submitHandler: viewModel.save });
jsFiddle で試す /
原文はこちら