だいたい563日前に更新最終更新日時: 2008-08-25 (月) 21:22:36 563日前
現在の位置
Memorycraft Wiki > SproutCoreのモダンなモデル層
SproutCore?のモダンなモデル層
MVCアプリケーションのモデル層には、いわゆるモデルオブジェクトが含まれています。
モデルオブジェクトは基本的に、データ変換のほか、データ(永続化データ)、計算プロパティ*1、他のオブジェクトとのリレーションを保持するために設計されたごく普通のオブジェクトです。
たとえば、To-Do リストマネージャでは、以下のデータを含んだToDo?というモデルオブジェクトを定義します。
- name : TODOの名前 (String)
- dueDate : 締め切り (Date)
- isCompleted : 完了フラグ (Boolean)
- isOverDue? : 期限切れフラグ (Booleanを返すFunction)
SproutCore?では新規モデルオブジェクトは sc-gen コマンドを使って自動生成します。
$ sc-gen model my_app/todo
生成された clients/my_app/models/todo.js ファイルは以下のような内容になっています。
// ==========================================================================
// MyApp.Todo
// ==========================================================================
require('core');
/** @class
(Document your class here)
@extends SC.Record
@author AuthorName
@version 0.1
*/
MyApp.Todo = SC.Record.extend(
/** @scope MyApp.Todo.prototype */ {
// TODO: Add your own code here.
}) ;
Key-Value コーディングと Key-Value 監視
モダンモデルレイヤーの実装における中心には、2つの補完的技術として、 Key-Value コーディング と Key-Value 監視 があります。 SproutCore?はこの2つの技術に対して、包括的かつ熟慮されたサポートを提供します。
- NOTE :
- key-value コーディングとkey-value 監視を利用するには、SC.Objectまたはそれを拡張したオブジェクト(例:SC.Record)から生成されたJavaScript?オブジェクトである必要があります。
Key-Value コーディング
Key-Valueコーディングとは単純に、オブジェクトの属性(保存されたプロパティ、計算プロパティ、およびリレーション)に対して、 通常のJavaScript?におけるオブジェクトプロパティへの直接アクセスの代わりに、文字列("key")を使用して間接的にアクセスすることを意味します。
たとえば、todoという名のTodoオブジェクトのnameプロパティに対して、key-valueコーディングでアクセスするにはこのように記述します
var n = todo.get("name") ;
下のように書いてはいけません
// SproutCoreではこのように書いてはいけません var n = todo.name ;
同様に、todoという名のTodoオブジェクトのnameプロパティをセットするには、このように記述します。
todo.set(‘name’, “something else”) ;
どちらも、該当する属性を識別するために文字列が使用されます。.
SproutCore?を使って実現しようとすることのほとんどは、key-value コーディングに準拠したメソッドを使用することがオブジェクトの属性にアクセスする唯一の手段であるという事実の上に成り立っています。作成したモデルオブジェクトが保持するデータを操作するコードを書くときに、key-value コーディングの前提を覆さないように注意してください。
- NOTE :
- Key-value コーディングは よく“KVC”と略されます.
Key-Value 監視
Key-Value 監視により、あるオブジェクトが別のオブジェクトの属性の変更を自動的に監視します。
これはモデルオブジェクトの属性を管理、表示することをアプリケーションアーキテクチャー全体の目的とするMVCアプリケーションのコントローラー層およびビュー層にとって、もっとも便利なものです。
key-value 監視を行なうことで、コントローラとビューはモデルオブジェクトの属性に対してglue code*2 を書くことなく、アプリケーション内で自動的に同期されます。 key-value 監視を使用するためには、モデルオブジェクトを key-value 監視に準拠させる必要があります。SC.Objectの標準のset()メソッドを使用していれば、保存されたプロパティに対して自動的に key-value 監視に準拠していることになります。
計算プロパティを key-value 監視に準拠させるためには、その計算プロパティがどの属性に依存しているかをSproutCore?に教えてあげる必要があります。
計算プロパティであるTodoオブジェクトのisOverdue属性をもう一度見てみましょう。以下のように実装されています。
isOverdue: function() {
if ( this.get(‘isCompleted’) ) return NO ;
else return ( this.get(‘dueDate’) < new Date() ) ? YES : NO ;
}.property( ‘isCompleted’, ‘dueDate’ )
説明が必要な部分が2つあります。
まず第1に、isOverdue関数を get("isOverdue") でアクセス可能な計算プロパティとするための、 property() メソッドで、これは全てのFunctionオブジェクトに適用できるようSproutCore?に組み込まれています。 一般的には以下のように使用されます。
computedPropertyName: function() { }.property()
2つめは、計算プロパティをkey-value 監視に準拠させるために、計算プロパティを実装するために使用した属性のkeyをproperty()メソッドのパラメータとして渡す必要があるということです。 以下のような感じです。
isOverdue: function() { }.property( ‘isCompleted’, ‘dueDate’ )
Functionオブジェクトのproperty()メソッドを使って、計算プロパティとしてオブジェクトの属性を定義し、その引数に依存する属性のkeyを渡してあげる。たったこれだけです!
- NOTE :
- Key-value コーディングは よく“KVO”と略されます.
注釈(R)
- 関連ページ
- Memorycraft Wiki561日前
- SproutCore ドキュメント翻訳561日前
- SproutCoreのモダンなモデル層2563日前
- SproutCoreのモダンなモデル層3563日前