読者です 読者をやめる 読者になる 読者になる

Bindable は単方向

どうやら、適当なコンポーネントをルートにした mxml ファイルを作って 適当にネームスペースを設定すれば、マイコンポーネントが作れるらしい。

ってんで、マイコンポーネントを作ってみようと思って、こんな mxml を書いた

2つのプロパティ left, right があって、単に字が並んで表示される swap() メソッドは左右を入れ替え、 clear([CLEAR_BOTH, CLEAR_LEFT, CLEAR_RIGHT]) は文字のクリア どこにでもありそうなコンポーネントだ。

left, right はStringで用意して、 2つのTextInputのtextプロパティとバインドしてみた。

# 常に _left.text, _right.text を使うのはダサい。

<?xml version="1.0" ?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
public static const CLEAR_BOTH:int = 0;
public static const CLEAR_LEFT:int = 1;
public static const CLEAR_RIGHT:int = 2;
[Bindable]
private var left:String;
[Bindable]
private var right:String;
public function swap():void{
var tmp:String;
tmp = left;
left = right;
right = tmp;
}
public function clear(type:int = CLEAR_BOTH):void{
if(type == CLEAR_BOTH){
left = "";
right = "";
}else if(type == CLEAR_LEFT){
left = "";
}else if(type == CLEAR_RIGHT){
right = "";
}
}
]]>
</mx:Script>
<mx:HBox>
<mx:TextInput id="_left" text="{left}" />
<mx:TextInput id="_right" text="{right}" />
</mx:HBox>
</mx:Panel>

適当なアプリケーションに貼り付けて使ってみたら、文字の入力は出来るんだけど swap() も clear() も動かない、あれぇ、ちゃんとバインドしてるのになぁと思ったら

Bindable なプロパティって、変更された時に propertyChange イベントを発火するだけなのね それを受けた参照側が更新するだけで

left と _left.text が両方向でリンクするわけじゃなく、leftの変更が _left.text に通知されるだけ なので

<mx:TextInput id="_left" text="{left}" change="left = _left.text" />
<mx:TextInput id="_right" text="{right}" change="right = _right.text" />

こうしなきゃいけなかったんだな

もっと上手くやる方法があるような気がするな