/** * @author Ed Spencer * * LocalStorageProxyでは、{@link Ext.data.Model モデル}のデータをクライアントのブラウザ上のローカルに保存するために、HTML5のlocalStorage APIを使います。HTML5のlocalStorageはキーバリューストア(つまり、JSONのような複雑なオブジェクトは保存できない)なので、LocalStorageProxyは保存・取得の際に自動的にデータをシリアル化・逆シリアル化します。 * * localStorageは、ユーザー固有の情報を保存するのに極めて便利であり、サポートにサーバーサイドのインフラストラクチャを必要としません。Twitter検索アプリケーションを書くときのことを考えてみましょう。ユーザーの検索をローカルに保存して、その検索を後で簡単に実行できるようにしたいとします。そのような場合、まず検索モデルを作成します。 * * Ext.define('Search', { * fields: ['id', 'query'], * extend: 'Ext.data.Model', * proxy: { * type: 'localstorage', * id : 'twitter-Searches' * } * }); * * この検索モデルに含まれるのは、idとqueryの2つのフィールドと、プロキシ定義だけです。LocalStorageプロキシに渡す必要のある設定は、{@link #id}だけです。重要なのは、これによりプロキシ内のモデルデータが他と分離されることです。localStorage APIは、あらゆるデータを単一の共有名前空間に配置します。したがって、idを設定すれば、LocalStorageProxyは保存された検索データを管理することができます。 * * データをlocalStorageに保存することは簡単で、通常は{@link Ext.data.Store ストア}によって行われます。 * * //our Store automatically picks up the LocalStorageProxy defined on the Search model * var store = Ext.create('Ext.data.Store', { * model: "Search" * }); * * //loads any existing Search data from localStorage * store.load(); * * //now add some Searches * store.add({query: 'Sencha Touch'}); * store.add({query: 'Ext JS'}); * * //finally, save our Search data to localStorage * store.sync(); * * store.sync()を呼び出すと、LocalStorageProxyは、新しい検索に自動的にidを設定します。そして、モデルデータをエンコードし、localStorageに配置します。また、ストアを完全にバイパスして直接localStorageに保存することもできます。 * * var search = Ext.create('Search', {query: 'Sencha Animator'}); * * //uses the configured LocalStorageProxy to save the new Search to localStorage * search.save(); * * # 制限事項 * * このプロキシを、ローカルストレージをサポートしていないブラウザで使うと、コンストラクタはエラーをスローします。ローカルストレージプロキシには一意のIDが必要です。このIDは、ローカルストレージオブジェクトに格納された全レコードデータのキーとして使われます。 * * この一意のIDを提供しないと、信頼性のあるIDを求めることができません。したがって、IDの提供は重要です。このIDが提供されなかった場合、アタッチされたストアにストアIDがあれば、それがIDとして使われます。どちらの選択肢も与えられなかった場合には、プロキシはエラーをスローします。 */ Ext.define('Ext.data.proxy.LocalStorage', { extend: 'Ext.data.proxy.WebStorage', alias: 'proxy.localstorage', alternateClassName: 'Ext.data.LocalStorageProxy', //inherit docs getStorageObject: function() { return window.localStorage; } });