リア充爆発日記

You don't even know what ria-ju really is.

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%成功して上記のデータが返ってくるので、用途によってテキトウに処理を追加するといいね!

エマ (1) (Beam comix)

エマ (1) (Beam comix)