はじめに
JsViewsではデータソースの値を変更する、およびデータソースの変更を監視する機能を、JsObservableというライブラリとして提供しています。JsObservableを使用すると、以下のことができます。
- データソースの値をJavaScriptから変更し、再度データバインドを行う
- データソースの値が変更された際に、通知を受け取り任意の処理を行う
今回はJsViewsの一部であり、MVVMパターンを実装するために不可欠なJsObservableの使い方を紹介します。
JsViewsを用いてMVVMパターンを実装する場合、ViewはHTMLで書かれたUIであり、ViewModelはJavaScriptのオブジェクトとして定義されたデータソースです。
JsObservableは、ViewModelとModelを繋ぐ働きをします。ModelはJsObservableを用いてViewModelを変更し、また、ViewModelが変更された際にJsObservableから通知を受け取ります。
対象読者
- JavaScriptデータバインドフレームワークに興味のある方
- WebアプリケーションにおけるMVVMパターンに興味のある方
- JavaScript、jQueryの基本を理解している方
必要な環境と準備
JsViewsとjQueryをダウンロードしてください。JsViewsのダウンロードページでjsviews.jsをダウンロードしてください。jsviews.jsにはJsRenderと同様に、JsObservableも含まれています。
JsViews(jquery.views.js)とJsObservable(jquery.observable.js)を個別にダウンロードすることもできます。個別にダウンロードする際は、JsRender、JsObservable、そしてJsViewsの3つをダウンロードしてください。
プロパティの変更
JsViewsはデータバインドフレームワークで、データソースとなるJavaScriptのオブジェクトを変更すると、UIであるHTMLが自動的に更新されます。
JavaScriptからデータソースを変更するには、データソースとなるJavaScriptオブジェクトのプロパティの変更をJsViewsに伝える必要があります。プロパティを変更するには、JsObservableのsetPropertyメソッドを使用します。
JavaScriptの代入演算子を使用してプロパティを変更しても、JsViewsはデータバインドを行わず、HTMLも更新されないので注意してください。
<!-- テンプレートの定義 --> <script id="itemTemplate" type="text/x-jsrender"> <b>{^{>name}}</b>の値段は<b>{^{>price}}円</b>です。<br/> 重さは<b>{^{>weight}}グラム</b>です。<br/> <img data-link="src{>image.url} alt{>image.alt}" /> </script> <!-- データバインドを行うHTML要素 --> <div id="linkedContent"></div><br/> <!-- ボタン --> <button id="equalOperatorTest">代入演算子を使用してプロパティの値を変更</button><br/> <button id="setPropertyTest1">setPropertyメソッドを使用してプロパティの値を変更</button><br/> <button id="setPropertyTest2">setPropertyメソッドにプロパティのパスを指定して値を変更</button><br/> <script type="text/javascript"> // データソースの定義 var item = { name: "みかん", price: 100, weight: 60, image: { url: "images/mikan.png", alt: "みかん画像" } }; // テンプレートオブジェクトを作成し、HTML要素#placeholderとデータソースitemを関連付ける $.templates("#itemTemplate").link("#linkedContent", item); // 1. 代入演算子を使用してプロパティの値を変更 // データソースを変更しても、UIは更新されない $("#equalOperatorTest").on("click", function(){ item.name = "ばなな"; }); // 2. setPropertyメソッドを使用してプロパティの値を変更 // データソースの変更に伴い、UIが更新される $("#setPropertyTest").on("click", function(){ $.observable(item).setProperty("name", "りんご"); }); // 3. setPropertyメソッドを使用してプロパティの値を変更 // プロパティのパスを指定する $("#setPropertyTest").on("click", function(){ $.observable(item).setProperty("image.url", "images/apple.png"); }); </script>
- ボタンがクリックされた際に、代入演算子を使用してデーターソースとなるJavaScriptのオブジェクトitemのプロパティを変更します。代入演算子を使用してプロパティを変更しても、データバインドは行われずHTMLは更新されません。
- ボタンがクリックされた際に、setPropertyメソッドを使用してプロパティを変更します。setPropertyメソッドは、$.observable(データソースのオブジェクト).setProperty(変更するプロパティのパス, 値)のように呼び出します。
- setPropertyの第1引数にパスを指定できます。