コールアウトを使用して名前の変更を許可したいと思います。コールアウトには、バインディングを介して入力される textInput (コンポーネントに埋め込まれている) が含まれています。吹き出しは毎回異なるテキストで開かれます。残念ながら、バインド データに書き込むことができるものは何でも、最初のテキストのみが毎回表示されます。サンプルを添付しました。
コールアウトが閉じたときにコンポーネントがビューにアタッチされ、コールアウトに再アタッチされると、textinput が正しく更新されることに気付きました。
どんな助けでも大歓迎です。
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="TestChgCallout2"
creationComplete="init()"
>
<fx:Declarations>
<s:Callout id="COrename"/>
<fx:Component className="Rename">
<s:VGroup>
<fx:Metadata>
[Event(name="cancel", type="flash.events.Event")]
[Event(name="updated", type="flash.events.Event")]
</fx:Metadata>
<fx:Script>
<![CDATA[
[Bindable] private var _nom:String="";
private var _NewName:String="";
public function set nom(s:String):void {
_nom=s;
_NewName="";
}
public function get nom():String {
return _NewName;
}
private function doUpd():void {
var req:XML=<req><oldName></oldName><newName></newName></req>;
req.oldName = _nom;
req.newName = Nom.text;
_NewName=Nom.text;
this.dispatchEvent(new Event('updated'))
}
]]>
</fx:Script>
<s:HGroup verticalAlign="middle">
<s:Label width="90" text="Nom" verticalAlign="middle"/>
<s:TextInput id="Nom" text="{_nom}" width="201" maxChars="23" restrict="a-z A-Z0-9" />
</s:HGroup>
<s:HGroup width="100%" verticalAlign="middle" horizontalAlign="center">
<s:Button label="cancel" click="this.dispatchEvent(new Event('cancel'))"/>
<s:Button label="update" click="doUpd()"/>
</s:HGroup>
</s:VGroup>
</fx:Component>
</fx:Declarations>
<s:HGroup gap="5">
<s:VGroup>
<s:Label text="{'Count:' + i.toString()}" />
<s:Label text="{'result:' + _res}" />
</s:VGroup>
<s:Button id="Bt" label="call" click="doCall()" />
</s:HGroup>
<fx:Script>
<![CDATA[
[Bindable] private var i:int=0;
private var renPlan:Rename = new Rename();
[Bindable] private var _res:String="";
private function init():void {
renPlan.addEventListener("cancel", onPlanUpdCancel);
renPlan.addEventListener("updated", onPlanUpdated);
COrename.addElement(renPlan);
}
private function doCall():void {
if (COrename.isOpen) {
COrename.close();
} else {
renPlan.nom = "test #"+i.toString();
COrename.open(Bt, false);
}
}
private function onPlanUpdCancel(e:Event):void {
i++;
COrename.close();
}
private function onPlanUpdated(e:Event):void {
i++;
_res = renPlan.nom;
COrename.close();
}
]]>
</fx:Script>
</s:View>