Knockoutはデータモデルを基盤としリッチなユーザインタフェース構築を行う目的で開発されたJavaScriptライブラリである。なお、Knockoutはマイクロソフトの従業員であるスティーブ・サンダーソンにより開発されメンテナンスされているオープンソースプロジェクトであり、マイクロソフト製品ではないがVisual Studio 2012のプロジェクトテンプレートとして jQueryと共に組込まれ、同製品の自動補完システムであるインテリセンスでの使用が可能となるなど、関係性はある。

概要 KnockoutはJavaScriptライブラリであるため、マイクロソフトが開発したASP.NET MVCだけではなく、Ruby on Rails等でも使用するできる。これはJSONでデータのやり取りを行う事によってサーバサイドのテクノロジに依存せずKnockoutを使用する事が可能なことによるためで、MVVMを用いた開発が行えることがメリットとして提示されているが、これも同じ理由で必須ではない。

Knockoutはコンセプトとして、以下の項目が上げられている。 宣言型バインディング 自動的なユーザインタフェースの更新 依存性の追跡 テンプレート

サンプル 単純なバインディング このサンプルでは2つのテキスト ボックスにデータ モデルをオブサーバブルな値がバウンドされ、以下の例では2つのテキストボックスの値をfullNameを表示する。これらはイベント ハンドリングを行わなくても、モデルが更新されるとテキストボックスに値が反映され、逆にテキストボックスが編集されるとモデルにも反映される。

View (HTML) <p>First name: <input data-bind="value: firstName" /></p> <p>Last name: <input data-bind="value: lastName" /></p> <h2>Hello, <span data-bind="text: fullName"> </span>!</h2>

View Model (Javascript) function ViewModel() { this.firstName = ko.observable("Planet"); this.lastName = ko.observable("Earth"); this.fullName = ko.computed(function() { return this.firstName() + " " + this.lastName(); }, this); }

ko.applyBindings(new ViewModel());

JSONを使用するバインディング このサンプルではJSONで記述された、データをリストとして表示している。以下のソースも上記のサンプルと同様でイベントハンドリングを行わなくてもよく、変更された値はJSONでサーバサイドに対し送信することもできる。

View (HTML) <table> <thead> <tr> <td>Id</td> <td>Cd</td> <td>Name</td> </tr> </thead> <tbody data-bind='foreach: products'> <tr> <td><span data-bind='text: Id' /></td> <td><span data-bind='text: Cd' /></td> <td><span data-bind='text: Name' /></td> </tr> </tbody> </table>

View Model (Javascript) var productModel = function (src) { var self = this; self.products = ko.observableArray(src); }; var viewModel = new productModel([ { Id:"10", Cd:"01588", Name:"Apple" }, { Id:"11", Cd:"05178", Name:"Banana" } ]); ko.applyBindings(viewModel);

脚注・出典

参考文献

関連項目

JavaScript Ajax AngularJS(1.x,2.0α Ver) Aurelia.js Backbone.js Ember.js JavaScriptライブラリ Javascript framework JQuery MooTools Polymer Prototype JavaScript Framework Ractive.js React Riot.js vue.js

外部リンク

Knockout JS: Helping you build dynamic JavaScript UIs with MVVM and ASP.NET Using Isotope with Knockout.js Knockout questions on StackOverflow Knockout forum on Google Groups knock out JS Examples Knockout.日本語ドキュメント