Подключение flex и weborb?

#asp.net #apache-flex #weborb

#asp.net #apache-flex #weborb

Вопрос:

я новичок в flex. У меня вопрос 🙂

У меня есть

 [Bindable] 
          private var model:AlgorithmModel = new AlgorithmModel(); 
          private var serviceProxy:Algorithm = new Algorithm( model ); 
  

В MXML

                     private function Show():void
        {

            // now model.Solve_SendResult = null
            while(i<model.Solve_SendResult.length) //
            {
                Draw(); //draw cube
            }
        }
                    private function Solve_Click():void
        {
            //request is a array
            Request[0] = 2;
            Request[1] = 2;
            Request[2] = 3;
            serviceProxy.Solve_Send(request);

            Show();

        }
<s:Button x="386" y="477" label="Solve" click="Solve_Click();"/>
  

И когда я звоню serviceProxy.Solve_Send(request); с запросом, это массив, и я хочу использовать model.Solve_SendResult в своем коде flex для рисования многих кубов, использующих papervison3d, но в первый раз, когда я получил model.Solve_SendResult = null . Но когда я снова нажимаю, все в порядке.

Кто-нибудь мне поможет? Спасибо?

Ответ №1:

Модель.Объект Solve_SendResult содержит результат выполненного ServiceProxy.Метод Solve_Send (запроса). Solve_Send будет выполняться асинхронно, и в результате в момент запуска метода show объект Solve_SendResult может по-прежнему иметь значение null.

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

  1. Создайте пользовательское событие

     package foo
    {
    import flash.events.Event;
    
    public class DrawEvent extends Event
    {
    public static const DATA_CHANGED:String = "dataChanged";
    
    public function DrawEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
    {
        super(type, bubbles, cancelable);
    }
    }
    }
      
  2. В вашем классе алгоритмов определите следующее:

     [Event(name=DrawEvent.DATA_CHANGED, type="foo.DrawEvent")] 
    public class Algorithm extends EventDispatcher{ 
    //your code
      
  3. В методе Solve_SendHandler класса Algorithm добавьте следующее

     public virtual function Solve_SendHandler(event:ResultEvent):void
    {
    dispatchEvent(new DrawEvent(DrawEvent.DATA_CHANGED));
    //your code
    }
      
  4. В вашем классе MXML создайте метод onLoad и добавьте прослушиватель событий к экземпляру класса Algorithm, как показано ниже:

     <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="onLoad()">
    
    public function onLoad():void
    {
       serviceProxy.addEventListener(DrawEvent.DATA_CHANGED, onDataChanged);
    }
    
    private function onDataChanged(event:DrawEvent):void{
    while(i<model.Solve_SendResult.length) //
        {
            Draw(); //draw cube
        }
     }
      
  5. внесите следующие изменения в метод Solve_Click():

     private function Solve_Click():void
    {
        //request is a array
        Request[0] = 2;
        Request[1] = 2;
        Request[2] = 3;
        serviceProxy.Solve_Send(request);
    }
      

Вот и все! Итак, в основном приведенный выше код выполняет следующее: вы добавили слушателя в свой сервис (класс алгоритма), и слушатель прослушивает DrawEvent.Событие DATA_CHANGED. Событие рисования.DATA_CHANGED будет отправлен, когда ваш клиент получит результат вызова Solve_Send. Таким образом, onDataChanged нарисует ваш куб или сделает все, что вы хотите 🙂

Описанный выше подход является базовым, и вы должны знать, как события работают в flex и как вы можете с этим справиться. Дополнительная информация доступна здесь:

http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html http://livedocs.adobe.com/flex/3/html/help.html?content=events_07.html

С уважением, Кирилл