Titanium Studio でプロジェクトを右クリックして、New > Alloy widget を選択して、新しい widget を作成できます。
CLI では、プロジェクトのルートディレクトリで、
$ alloy generate widget NAME
とすると、同様に作成できます。
さて、この widget に利用する側からイベントを追加したいのですが、通常の view に対してと同じように
$.mywidget.on( EVENTNAME, FUNCTION);
を使っても、iOSでは何の効果もありません。
Android では、
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 内の view がカプセル化されていないのは、なんだか解せない気もしないでもないですが ... )
widget にも on が使えるようになってるのが一番いいんですけどねぇ。
0 件のコメント:
コメントを投稿