TitaniumAlloyを触り始めました。今までclassicスタイルで書いていたのですが、$.destroyとデータバインディングに惹かれて挑戦してみました。

ネット上の情報などを参考にしたみたのですが、Collectionでのデータバインディングは結構書いてあるのですが、単体Modelでのデータバインディングについてがあまり書いてなかった。
(単体Modelってそもそもありえないのかな?)

ViewでModelバインドするには、

<Model src="MyModel" id="MyModel" instance="true"/>
と宣言しておくことで、XML内部で{{$.MyModel.title}が使えました。

意図しなかったこととして、modelのdefaultsに値を入れておいてもcontrollerでfetchしないと値が挿入されませんでした。fetchなどをしてmodelに変化を与えないとviewにnotifyされないのかな?とか妄想。

また、modelのfetch方法ですが、controllerでidを指定するのがだるかったので、modelのinitializeでidをセットしてしまって(id:1とか)、controllerではfetchするだけにしました。
(initializeでfetchしてもviewには伝播されなかった)

次の実験として、window1とwindow2で同じようにmodelをインスタンス化してset,saveしたのですが、互いのwindow内の値は変化しませんでした。

まあ考えてみればわかることなのでしょうが、同じstorageから引っ張ってきたとしても、オブジェクトが一意じゃないからですよね。ということでシングルトンにするにはどうしたらいいのかと。

ゲームなんか作っていたら、バトルでお金が増えてホームに戻ってきたらお金が増えてるようにしたいですよね。ホームに戻ってきたら、というイベントでfetchするのはちょっといけてないので、やっぱりシングルトンにしたい。

シングルトンにするには、
<Model src="MyModel" />
とするだけだった。
{MyModel.title}で値は取れる。


でも相変わらず新しいバインド先にはfetchはしないと反映されない。

という調査。
MongoDBを初めてサービスに適用してみました。

iTunesのAPIとYoutubeDataApiのjson結果をMongoDBにキャッシュするのに使いました。

そんときにやった自分の処理などを。

cache_key, json, createdという単純なスキーマでcollectionを作って、APIの結果をjsonにまるごとぶちこむ感じですね。
createdはexpireのために残しておく。

cache_keyなんですが、これはちょっと独特のやり方で決めていまして。

もともと、APIを叩くクラスを持っていたので、それをラップするというかProxyするというか、そんな感じの、CacheProxyクラスを作って、そいつ経由で実際の関数を叩きます。

class CacheProxy{
public function fetch($Model, $method, $args=array()){
$cache_key = get_class($Model) . "_" . $method;
foreach($args as $val){
$cache_key .= "_" . $val;
}
$res = $MongoCache->get($cache_key);
if($res) return $res;
$res = call_user_func_array(array($Model, $method), $args);
$MongoCache->set($cache_key, $res);
return $res;
}
}

叩く方は、
$res = $CacheProxy->fetch($YoutubeApi, 'search', array('unko'));
こんな感じですね。

controller側は特にキャッシュするしないを意識せずに、proxyが勝手にやってくれるイメージです。