【问题标题】:Flex actionscript, get data from AsyncToken callFlex actionscript,从 AsyncToken 调用中获取数据
【发布时间】:2015-08-05 15:39:03
【问题描述】:

我有 blazeDS 的 Flex/Java 项目。现在我有一个 actionscript 文件,它调用另一个 actionscript 的方法,该方法调用 remoteObject(在 db 上进行简单选择的 java 类)

代码如下:

Home.as

..
private var _dm:DataManager = new DataManager;
public function getPerson():void { // this is connect to a button in .mxml
    _dm.getPerson();
}
..

DataManager.as

public class DataManager {
    private var _service:RemoteObject;
    private var _url:URLRequest;
    private var loCs:ChannelSet = new ChannelSet();

    public function DataManager () {
        _service = new RemoteObject("PeopleDAO");
        loCs.addChannel(new AMFChannel("canale", "http://localhost:8080/FlexTRYOUT/messagebroker/amf"));
        _service.channelSet = loCs;
    }

    private function onFault(event:FaultEvent,token:Object):void {
        var _fail:String = "fault";
    }
    private function onResult(event:ResultEvent,token:Object):void {
        per = event.result as People; // is a bean class
        Alert.show(per.nome);
    }

    public function getPerson():void {
        var token:AsyncToken = _service.getPersona();
        token.addResponder(new AsyncResponder(onResult,onFault));
    }
}

调用工作正常,它调用DataManger.java 类的java 方法名称getPerson()。它只返回一个带有姓名和姓氏的对象(理解这个该死的 AsyncCall 只是一个很好的世界)。问题是我不知道如何使用经典(java)返回类型将此结果发送到Home.as。我在onResult 方法中有结果,但我不知道如何得到它。

我尝试按照 Brian 的指示进行操作,但我只是在浪费时间。也许是因为我不是 flex actionscript 程序员,但我添加了 Brian 发布的代码:

public function getPerson():void { // this is connect to a button in .mxml
    _dm.addEventListener(DATA_RECEIVED, onPersonFound); * compile error 1
    _dm.getPerson();
}

错误是 DATA_RECEIVED 未定义

比在 DataManager 中:

public class DataManager {
    public static const DATA_RECEIVED:String = "DATA_RECEIVED";

    ...

    private function onResult(event:ResultEvent,token:Object):void {
        per = event.result as People; // is a bean class
        dispatchEvent(new DataReceivedEvent(DATA_RECEIVED, per)); * compile error 2
    }
}

错误 2 是调用了可能的未定义方法 dispatchEvent

错在哪里?请大家写下完整的代码,因为我在使用 flex - actionscript - 从两天开始就开始了,我有一些时间来尝试解决方案。谢谢

好的,对不起,我只是用同样的问题创建一个新的(但更详细和更清晰)。一步一步我正在研究这种语言,并且我设法实现了 Brian 代码,但是 DataManager.as 类必须扩展 EventDispatcher,如果我不扩展它,我就会发布我发布的编译错误。目前我设法在 addEventListener 调用中定义的方法中获取 resultEvent 数据(在本例中为 onPeopleFound )。非常感谢布赖恩,我想我将来肯定会再次需要你的帮助(至少在项目被接受之前)。再见

【问题讨论】:

  • 您在DataManager 中有一个错误(私有函数在构造函数中)。我认为这只是你在这里写的一个错字,因为你会收到不同的错误消息,所以我修复了它。
  • 谢谢,但有人可以帮我解决这个问题吗??

标签: actionscript-3 apache-flex


【解决方案1】:

您可以调整方法getPerson 使两个参数引用回调函数。

public function getPerson(onResultCallback:Function, onFaultCallback:Function):void {
   var token:AsyncToken = _service.getPersona();
   token.addResponder(new AsyncResponder(onResultCallback,onFaultCallback));
}

这样你可以在你需要的类的实例中接收数据。

【讨论】:

    【解决方案2】:

    一种选择是在您从 Java 调用中取回数据时分派一个事件:

    Home.as

    ...
    public function getPerson():void { // this is connect to a button in .mxml
        _dm.addEventListener(DATA_RECEIVED, onPersonFound);
        _dm.getPerson();
    }
    
    private function onPersonFound(dataEvent:DataReceivedEvent):void {
        var person:People = dataEvent.people;
        //Do important processing...
    }
    ...
    

    在 DataManager.as 中

    public class DataManager {
        public static const DATA_RECEIVED:String = "DATA_RECEIVED";
    
        ...
    
        private function onResult(event:ResultEvent,token:Object):void {
            per = event.result as People; // is a bean class
            dispatchEvent(new DataReceivedEvent(DATA_RECEIVED, per));
        }
    }
    

    DataReceivedEvent.as 看起来就像How to dispatch an event with added data - AS3 的答案

    public class DataReceivedEvent extends Event
    {
        public static const DATA_RECEIVED:String = "DATA_RECEIVED";
    
        // this is the object you want to pass through your event.
        public var result:Object;
    
        public function DataReceivedEvent(type:String, result:Object, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
            this.result = result;
        }
    
        // always create a clone() method for events in case you want to redispatch them.
        public override function clone():Event
        {
            return new DataReceivedEvent(type, result, bubbles, cancelable);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 2012-08-24
      • 2014-11-22
      • 1970-01-01
      相关资源
      最近更新 更多