2014年10月3日金曜日

Titanium Tips: Alloy のモジュール間での汎用的なデータのやりとり方法

前回のTitanium Tips: Alloy での部品化でソースを分割する方法をまとめましたが、今回はそれぞれに依存しないようなパーツ間でのデータのやり取り方法の(自分用)まとめ。

選択方法としては
  1. Alloy.Globalsなど
  2. Ti.App によるユーザ定義のイベント通信
から選べそうです。
(他にもありそうですが、私自身は見つけられていない…)

ただ、どちらもグローバルにリソースを食うことになるので、使いすぎやメモリリークには注意しましょう。

1.  Alloy.Globalsなど

公式の Alloy クラスをみれば分かりますが、次のような全 controller からアクセス可能なデータ格納用オブジェクトが用意されています。
(一部は controller 以外からのアクセス方法もあり)
  • Globals: 任意の変数・関数をプロパティとして格納可能
  • CFG:  app/config.json で定義した Key/Value 値
  • Collections: Collection用
  • Models: Model用
Globals, CFG は特に使いやすいと思われます。

2. Ti.App によるユーザ定義のイベント通信

公式の Application-Level Events に
App-level events are global to your app. They are accessible in all contexts, functional scopes, CommonJS modules, and so forth.
とあるように Ti.App.addEventListener() で定義したカスタムイベントは Ti.App.fireEvent() でコンテキストを超えて呼び出し可能です。
WebView を扱う際には必須ともいえる方法です → Communication Between WebViews and Titanium

removeEventListener() で登録解除できますが、引数に add した際の関数を渡す必要があるので、無名関数の場合には関数の参照を保存しておく必要があるので注意して下さい。
登録時
var listener = function() { Ti.API.info("Event listener called."); }
window.addEventListener('click', listener);

解除時
window.removeEventListener('click', listener);
 また、上記の WebView での例ではイベント名に "app:fromTitanium" のように "app:" という prefix をつけて、名前衝突が起こるのを推奨しています(もちろん必須ではありません)。

0 件のコメント:

コメントを投稿