2013/05/04

Titanium Alloyのカスタムwidgetで、Androidでは、addEventListenerがエラーになる

Alloy である程度まとまった view を作るのには、独自の widgetを 作るのが便利だと思われます。
Titanium Studio でプロジェクトを右クリックして、New > Alloy widget を選択して、新しい widget を作成できます。
CLI では、プロジェクトのルートディレクトリで、
$ alloy generate widget NAME
とすると、同様に作成できます。

さて、この widget に利用する側からイベントを追加したいのですが、通常の view に対してと同じように
$.mywidget.on( EVENTNAME, FUNCTION);
を使っても、iOSでは何の効果もありません。
Android では、
05-04 11:45:58.802: E/V8Exception(4776): Exception occurred at ti:/events.js:172: Uncaught TypeError: Object #<Controller> has no method '_hasListenersForEventType'
という実行時エラーになります。

また、作成された widget の widget.js に、
exports['addEventListener'] = $.label['addEventListener'];
を追加した上で(label は、widget 内で追加されたラベルなどの view の id です)、
$.mywidget.addEventListener( EVENTNAME, FUNCTION);
してみます。これは、iOS では正しく働くようですが、Android の場合、
05-04 11:45:58.802: E/V8Exception(4776): Exception occurred at ti:/events.js:172: Uncaught TypeError: Object #<Controller> has no method '_hasListenersForEventType'
という実行時エラーになります。



多分バグです。

ということで、いろいろ思案したあげく、現状の Alloy (1.1.0とか、1.1.1) では、
$.mywidget.label.addEventListener( EVENTNAME, FUNCTION);
のような書き方をせざるをえないようです。
(widget 内の view がカプセル化されていないのは、なんだか解せない気もしないでもないですが ... )

widget にも on が使えるようになってるのが一番いいんですけどねぇ。

プロジェクト一式

widgeteventtest







0 件のコメント:

コメントを投稿