選択方法としては
- Alloy.Globalsなど
- 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 に
WebView を扱う際には必須ともいえる方法です → Communication Between WebViews and Titanium
removeEventListener() で登録解除できますが、引数に add した際の関数を渡す必要があるので、無名関数の場合には関数の参照を保存しておく必要があるので注意して下さい。
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 した際の関数を渡す必要があるので、無名関数の場合には関数の参照を保存しておく必要があるので注意して下さい。
登録時また、上記の WebView での例ではイベント名に "app:fromTitanium" のように "app:" という prefix をつけて、名前衝突が起こるのを推奨しています(もちろん必須ではありません)。
var listener = function() { Ti.API.info("Event listener called."); }
window.addEventListener('click', listener);
↓
解除時
window.removeEventListener('click', listener);
0 件のコメント:
コメントを投稿