Titanium AlloyのSync Adapterでナイススケルトン
http://docs.appcelerator.com/titanium/3.0/#!/guide/Alloy_Sync_Adapters_and_Migrations
backboneに限らず、だいたいModelはDBなどのストレージとデータ構造の同期をとることによって永続化する。とかその逆とか。
backboneはBackbone.syncというメソッドを通してそれが行われ、もともとのBackbone.jsはWeb用途だったので、syncのデフォルトの挙動はRESTfulなJSONリクエストが発行される。
一方Alloyでは、永続化先として、SQLite(Android or iOS)かHTML5のlocalStrageかTitaniumが用意したpropertiesの3種類が用意されている。
なんでRESTfulAPIがないの!
欲しい人は他の人が作ったものを探すか、作るかするしかない。RESTfulのは探せばいくつか見つかるけど、ちゃんとコード読んでいじれるやつにしたほうがいいっすよ。
で、今回欲しいのは最終的にはRESTfulにやりとりする予定だけど
- RESTfulなサーバがまだない。
- でも、データのIFは決まっている。
- サーバ側がいじることによってクライアントサイドの開発に影響をあたえたくない
ということで、たとえばfetch()を呼んだら通信発生させずに、決まったJSONデータが返るようなヤツだ。
Sync Adapterはadapter名.jsでapp/assets/alloy/sync か app/lib/alloy/syncにおくと、alloyのコンパイラがよきに対処してくれる。
Sync Adapterは3つのfunctionをexportsしてて
- module.exports.beforeModelCreate (optional) : Modelが作られる前にコールされるfunction。1つ目の引数はmodelで定義したconfig。2つ目はAlloyのModel名で、返り値としてconfigを返す、らしい。よくわかんねー。
- module.exports.afterModelCreate (optional) : Modelが作られたあとに呼ばれるfunction。1つ目が作られたばかりのModel。2つ目はAlloyのModel名。
- module.exports.sync :これがSyncの実装。唯一、必須とされているfunction。で、実装にあたってはこいつを参考にしろということらしい。http://docs.appcelerator.com/backbone/0.9.2/#Sync
※Alloyで採用されているBackbone.jsは0.9.2なのでちょっと古い
えー、これだけ・・・。まぁ、やりたいことはカンタンなことだから。。
Backboneのドキュメントを見るとsync(method, model, [options])ということらしい。
method – the CRUD method ("create", "read", "update", or "delete")
model – the model to be saved (or collection to be read)
options – success and error callbacks, and all other jQuery request options
うーん。わかるようなわからないような。まあやってみるべー。
前回のエントリで記事モデルのArticleを出したので、それにtitle: "I am a ria10!", desc: "ria10 is the real nice guy!"という感じの固定データを詰める、というのをやって見るテスト。
で、意外とハマりポイントもなく15分ほどでできた。
app/assets/alloy/sync/sample.js
var articleDataJsonString = '{"title":"I am a ria10!","desc": "ria10 is the real nice guy!"}'; var articleDataJson = JSON.parse(articleDataJsonString); module.exports.sync = function(method, model, options) { for (var i in articleDataJson) { model[i] = articleDataJson[i]; model.length++; } options.success(articleDataJson, JSON.stringify(articleDataJson)); };
なぜ、ここは素のJSかというと、alloy.jmkの改変がすごくめんどくさかったから。
で、model側ではこうする。
article.coffee
exports.definition = config: adapter: type: "sample", collection_name: "article" idAttribute: "id" extendModel: (Model) -> _.extend(Model.prototype, {} ) Model extendCollection: (Collection) -> _.extend(Collection.prototype, {} ) Collection
この状態だと、fetchしようがsaveしようが、100%成功して上記のデータが返ってくるので、用途によってテキトウに処理を追加するといいね!
- 作者: 森薫
- 出版社/メーカー: エンターブレイン
- 発売日: 2002/08/26
- メディア: コミック
- 購入: 5人 クリック: 155回
- この商品を含むブログ (419件) を見る