Доброго времени суток, возник вопрос по флексу:
Сразу оговорюсь, что я очень-очень начинающий, мое понимание работы AS может сильно отличаться от происходящего в реальности, и правки хотелось бы получить в виде кода, а не общих рекомендаций, заранее благодарен
В общем, содрал я с Tour de Flex пример переводчика (Cloud APIs -> Google Translate), пошел курочить код. dataProvider для менюх (объект из пар: лэйбла и еще одной строки) сделал глобальной переменной, и заодно сделал его dataProvider'ом для List. Еще один лист пустой, оба с включенным драг-энд-дроп.
Инициализация и пристыковка менюх к попапБуттонам стоит на событии их создания.
Проблема: кнопки получают фиксированные меню: dataProvider изменяется при перетаскивании содержимого между Лист-контейнерами, и, если между открытием попапов перетащить несколько эл-тов в Листах - эти изменения отразятся. Но вот после первого открытия попапБуттона его содержимое уже не меняется. Как заставить его отслеживать происходящие в датаПровайдере изменения после инициализации?

Код AS3:
<?xml version="1.0" encoding="utf-8" ?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" backgroundColor="0x000000" width="550" height="355" layout="absolute" backgroundGradientColors="[#2BEFF1, #0B8074]" backgroundGradientAlphas="[1.0, 1.0]">
- <mx:Script>
- <![CDATA[
import mx.events.MenuEvent;
import mx.controls.Menu;
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;
import com.adobe.serialization.json.JSON;
//config constants
//private var googleURL:String = 'http://ajax.googleapis.com/ajax/services/search/web'; for web search
private var googleURL:String = 'http://ajax.googleapis.com/ajax/services/language/translate';
private var version:String = '1.0';
private var format:String = 'text';
private var sourceID:String = "en";
private var destID:String = "ru";
private var dp:Object = [{label:"English",data:"en"},{label:"Русский",data:"ru"},{label:"Spanish",data:"es"},{label:"French",data:"fr"},{label:"Italian",data:"it"},{label:"Portuguese",data:"pt"},{label:"German",data:"de"},{label:"Arabic",data:"ar"},{label:"Chinese",data:"zh"},{label:"Hebrew",data:"he"},{label:"Japanese",data:"ja"},{label:"Korean",data:"ko"}]
private function clickHandler(ev:MouseEvent):void{
if(sourceText.text != ""){
newQuery(sourceText.text,sourceID,destID);
}
}
//call http service and send query to google
private function newQuery(q:String,lang1:String,lang2:String):void{
var service:HTTPService = new HTTPService();
service.url = googleURL;
service.request.v = version;
service.resultFormat = format;
service.request.q = q;
service.request.langpair = lang1 + "|" + lang2;
service.addEventListener(ResultEvent.RESULT, onServerResponse);
service.send();
}
//results from google API
private function onServerResponse(event:ResultEvent):void {
try {
var tempData:String = String(event.result);
var feed:Object = JSON.decode(tempData);
//trace(feed.responseData.translatedText);
transText.text = feed.responseData.translatedText;
/* for web search results
for(var p:String in feed.responseData.results){
trace(feed.responseData.results[p].titleNoFormatting);
trace(feed.responseData.results[p].url);
trace(feed.responseData.results[p].content);
trace(feed.responseData.results[p].title);
} */
}
catch(ignored:Error) {
}
}
//setup dropdown menus
private var menu:Menu
private function initMenu(ev:Event):void{
menu= new Menu();
menu.dataProvider = dp;
if(ev.target.id == "popSource"){
menu.selectedIndex = 0;
menu.addEventListener(MenuEvent.ITEM_CLICK,popSourceHandler);
menu.addEventListener(MenuEvent.CHANGE,changeMenu);
ev.target.label = menu.dataProvider[0].label;
}
else{
menu.selectedIndex = 1;
menu.addEventListener(MenuEvent.ITEM_CLICK,popDestHandler);
ev.target.label = menu.dataProvider[1].label;
}
ev.target.popUp = menu;
}
//on source button dropdown select
private function popSourceHandler(ev:MenuEvent):void{
popSource.label = ev.item.label;
sourceID = ev.item.data;
}
//on destination button dropdown select
private function popDestHandler(ev:MenuEvent):void{
popDestination.label = ev.item.label;
destID = ev.item.data;
}
private function changeMenu(ev:MenuEvent):void{
ev.target.popUp = menu;
}
private function clickAuthor():void{
var homepage:URLRequest = new URLRequest("http://someurl.com");
navigateToURL(homepage);
}
private function changeDirection():void{
var data:String;
data = popDestination.label;
popDestination.label = popSource.label;
popSource.label = data;
data = destID;
destID = sourceID;
sourceID = data;
}
private function listCreate(ev:Event):void{
listSource.dataProvider=dp;
}
]]>
</mx:Script>
- <mx:Panel id="mainPanel" title="Переводчик" width="540" height="345" borderAlpha="0.2" layout="absolute" backgroundColor="0xECECEC" color="0xFFFFFF" horizontalAlign="left" horizontalCenter="0" verticalCenter="0" cornerRadius="4" verticalAlign="top">
- <mx:TabNavigator x="0" y="0" width="520" height="305" color="#2588B6" backgroundColor="#BBD5F9">
- <mx:Canvas label="Перевод" width="100%" height="100%" color="#2588B6" backgroundColor="#6199EC" backgroundAlpha="0.0">
- <mx:HBox width="498" height="162" color="0x323232" x="10" y="5">
- <mx:VBox width="50%" height="155" horizontalAlign="center">
<mx:Label text="Введите текст:" fontWeight="bold" />
<mx:TextArea height="80%" width="100%" id="sourceText" editable="true" />
<mx:PopUpButton id="popSource" creationComplete="initMenu(event);" width="100" openAlways="true" click="initMenu(event);" />
</mx:VBox>
<mx:VRule height="80%" />
- <mx:VBox width="50%" height="155" horizontalAlign="center">
<mx:Label text="Перевод:" fontWeight="bold" />
<mx:TextArea height="80%" width="100%" id="transText" editable="true" />
<mx:PopUpButton id="popDestination" creationComplete="initMenu(event);" width="100" openAlways="true" />
</mx:VBox>
</mx:HBox>
<mx:LinkButton label="by lifecoder" enabled="true" click="clickAuthor();" color="#41A9E4" fontStyle="normal" fontWeight="bold" textAlign="right" x="421" y="240" />
- <mx:Button x="10" y="230" icon="@Embed(source='../pic/Help Blue Button.png')" width="36" height="32" enabled="true">
<mx:click>{Alert.show('Work in progress. Yesterday, Today, Tomorrow.');}</mx:click>
</mx:Button>
<mx:Button x="156" y="203" label="<-- направление перевода -->" color="#000000" click="changeDirection();" />
<mx:Button label="Перевести!" color="0x323232" click="clickHandler(event);" height="20" x="214" y="175" />
</mx:Canvas>
- <mx:Canvas label="Настройки" width="100%" height="100%">
<mx:List x="49" y="10" width="123" height="252" creationComplete="listCreate(event);" id="listSource" dragEnabled="true" dragMoveEnabled="true" dropEnabled="true" />
<mx:List x="337" y="10" width="123" height="252" dragEnabled="true" dragMoveEnabled="true" dropEnabled="true" />
</mx:Canvas>
</mx:TabNavigator>
</mx:Panel>
</mx:Application>