Knockoutの基本コンセプト

以下の内容は、Knockout(KO)のドキュメントページをベースに一部自分なりの解釈を加えています。オフィシャルなドキュメントはこちらを参照してください。

Knockout(KO)はJavaScriptMVVMパターンを実現するためのライブラリです。MVVMはWPFSilverlightにおいて多く利用されている開発パターンで、超ざっくりですが(汗)、UIとロジックを分離することで、アプリケーションの保守性や再利用性を向上させ、(議論はありますが)各機能の単体テストを容易にする開発パターンです。

KOにおけるMVVM

Model(モデル)
アプリケーションが使用するデータソース。UIには依存しないオブジェクトもしくはある一連の操作(トランザクション)。

KOではAjaxコールによりサーバ側のコードにてModelの読み書きを行うのが一般的な手法。

View Model(ビューモデル)
ある(一連の)機能を実現するために必要なデータソースおよび処理を提供するオブジェクト。

例えばユーザ名簿を編集する機能のためのView Modelは、ユーザ名簿(データソース)と、ユーザ名簿の追加(機能1)、ユーザ名簿の削除(機能2)、ユーザ名簿の更新(機能3)を提供する。View Modelはコードのみで実装されたオブジェクトでありそのデータソースあるいは機能はどのようなUIによって利用されるかについては関知しない。例えば前述の例であれば、ユーザ名簿の追加機能がどのようなトリガーによって実行されるか(追加ボタンをクリック、ユーザ名入力後のEnterキー押下時等)は実装の際に意識しない。このためUIデザイン(View)が変更になってもロジック(View Model)は変更する必要がない。

KOではView ModelはJavaScriptによって実装されたオブジェクトであり、htmlの構造には一切関与しない。

View(ビュー)
アプリケーションのUI(デザイン)であり、View Modelが提供するデータソースと機能を表示する。ボタンのクリックによりView Modelの機能を実行したり、View Modelの状態が変化すると自身の表示を更新する。

KOではViewは単純にUIを定義したhtmlとなる。

実装の流れ

View Model の作成例

var myViewModel = {
    personName: 'Bob',
    personAge: 123
};

ViewからViewモデルを利用
data-bind属性により利用するビューモデルのプロパティを指定(バインド)します。

名前は <span data-bind="text: personName"></span>です。

Knockoutの有効化
上記例の"data-bind"属性は標準のhtmlでは定義されていないため、正常にバインドを動作せるには以下のスクリプトを実行しKnockoutの有効化を有効化させる必要があります。

ko.applyBindings(myViewModel);

ここで注意が必要なのは、DOM構築後でないとKnockoutを有効化できない点です。そのため上記のスクリプトをhtmlドキュメントの最下部で実行するか、jQueryの$(function) でラップするなどしてDOM構築後に有効化します。

$(function() {
	ko.applyBindings(myViewModel);
});

実際に使ってみた例は以下を参照してください。
knockoutをとりあえず使ってみる