1

我是 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。但是当我再次单击时,一切正常。

有人帮我吗?谢谢?

4

1 回答 1

0

model.Solve_SendResult 对象包含执行的 serviceProxy.Solve_Send(request) 方法的结果。Solve_Send 将异步执行,因此,在您触发 show 方法时,Solve_SendResult 对象可能仍为空。

作为解决方案,您可以使用以下方法:

  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. 在 Algorithm 类的 Solve_SendHandler 方法中添加以下内容

    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 事件。当您的客户端收到 Solve_Send 调用的结果时,将分派 DrawEvent.DATA_CHANGED。因此,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

问候,西里尔

于 2011-12-22T18:58:59.440 回答