Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.04.2009, 23:52
lifecoder вне форума Посмотреть профиль Отправить личное сообщение для lifecoder Найти все сообщения от lifecoder
  № 1  
Ответить с цитированием
lifecoder

Регистрация: Apr 2009
Сообщений: 6
Question Обновление меню popUpButton при обновлении data provider

Доброго времени суток, возник вопрос по флексу:

Сразу оговорюсь, что я очень-очень начинающий, мое понимание работы 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>

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 20:11.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.