Как мне реализовать RemoteObject во внешнем классе?

#apache-flex #actionscript-3 #remoteobject

#apache-flex #actionscript-3 #remoteobject

Вопрос:

Вот код:

 public class Schem
{
    public var info:String="";      

    public function Schem()
    {
    }

    public function loadCurrentSchem():void
    {
        var ro:RemoteObject = new RemoteObject("Hibernatetest");
        ro.endpoint = "http://Jesus/blazeds/messagebroker/amf";
        ro.addEventListener(ResultEvent.RESULT,onResult);
        ro.getCells();
        info = info   "Loader called ... n";




    }

    public function onResult(event:ResultEvent):void
    {
        var array:ArrayCollection = event.result as ArrayCollection;
        info = info   "Schemlength = "   String(array.length)  "n";
    }


    private function onFault(event:FaultEvent):void
    {
        info = info   "Errorhandler Called";
    }
    //Eventhandlers


    //Getters, Setters
}
  

К сожалению, он не доходит до обработчика событий, когда я вызываю функцию loadCurrentSchem(). Что не так?

Вот как я вызываю класс:

 <fx:Script>
    <![CDATA[
        import argoseye.main.Golem;
        import argoseye.main.Schem;

        import mx.collections.ArrayCollection;
        import mx.rpc.AsyncToken;
        import mx.rpc.Responder;
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import mx.rpc.remoting.RemoteObject;

        protected function button1_clickHandler(event:MouseEvent):void
        {
            var schem:Schem = new Schem();
            schem.loadCurrentSchem();
            textfeld.text = schem.info;
        }

    ]]>
</fx:Script>
  

Там.

Комментарии:

1. Вы уверены, что ваша конечная точка подвергается атаке?

2. Да, это так. По двум причинам. Во-первых: этот самый код отлично работает в теге сценария приложения, а во-вторых: консоль BlazeDS считает успешный вызов.

3. Вы тоже пытались подписаться на fault событие? Может быть, обработчик результата не вызывается из-за какой-то ошибки, которую вы вообще не прослушиваете?

4. Просто сделал это, и, как и ожидалось, ничего. Я не понимаю difference…it должно работать в классе serpate, to, не так ли?

5. В будущем используйте точки останова отладчика или trace() инструкции, чтобы убедиться, что какой-то метод вызывается или нет 🙂

Ответ №1:

Проблема в том, что вы должным образом не убедились, что обработчик результата вызван правильно. Дело в том, что когда вы используете:

 textfeld.text = schem.info;
  

вы установили значение:

 info = info   "Loader called ... n";
  

в виде текста текстового поля, и это значение не изменяется в обработчике результата.

Вы можете решить эту проблему по крайней мере двумя способами:

  • Расширьте свой Schem класс из EventDispatcher и поместите туда метаданные событий.

Класс:

 [Event(name="result", type="mx.rpc.events.ResultEvent")]
[Event(name="fault", type="mx.rpc.events.FaultEvent")]
public class Schem extends EventDispatcher
{
    public var info:String="";      

    public function Schem()
    {
    }

    public function loadCurrentSchem():void
    {
        var ro:RemoteObject = new RemoteObject("Hibernatetest");
        ro.endpoint = "http://Jesus/blazeds/messagebroker/amf";
        ro.addEventListener(ResultEvent.RESULT,onResult);
        ro.addEventListener(FaultEvent.FAULT,onFault);
        ro.getCells();
        info  = "Loader called ... n";




    }

    private function onResult(event:ResultEvent):void
    {
        var array:ArrayCollection = event.result as ArrayCollection;
        info  = "Schemlength = "   String(array.length)  "n";
        dispatchEvent(event);
    }


    private function onFault(event:FaultEvent):void
    {
        info  = "Errorhandler Called";
        dispatchEvent(event);
    }
    //Eventhandlers


    //Getters, Setters
}
  

Затем в вашем классе MXML:

 <fx:Script>
    <![CDATA[
        import argoseye.main.Golem;
        import argoseye.main.Schem;

        import mx.collections.ArrayCollection;
        import mx.rpc.AsyncToken;
        import mx.rpc.Responder;
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import mx.rpc.remoting.RemoteObject;

        protected function button1_clickHandler(event:MouseEvent):void
        {
            var schem:Schem = new Schem();
            schem.addEventListener(ResultEvent.RESULT,onResult);
            schem.addEventListener(FaultEvent.FAULT,onFault);
            schem.loadCurrentSchem();
            textfeld.text = schem.info;

        }

    private function onResult(event:ResultEvent):void
    {
        textfeld.text = event.currentTarget.info;
    }

    private function onFault(event:FaultEvent):void
    {
        textfeld.text = event.currentTarget.info;
    }
    ]]>
</fx:Script>
  
  • Второй способ — использовать привязку данных.

Schem класс:

 public class Schem
{
    [Bindable]
    public var info:String="";      

    public function Schem()
    {
    }

    public function loadCurrentSchem():void
    {
        var ro:RemoteObject = new RemoteObject("Hibernatetest");
        ro.endpoint = "http://Jesus/blazeds/messagebroker/amf";
        ro.addEventListener(ResultEvent.RESULT,onResult);
        ro.addEventListener(FaultEvent.FAULT,onFault);
        ro.getCells();
        info  = "Loader called ... n";
    }

    private function onResult(event:ResultEvent):void
    {
        var array:ArrayCollection = event.result as ArrayCollection;
        info  = "Schemlength = "   String(array.length)  "n";
    }


    private function onFault(event:FaultEvent):void
    {
        info  = "Errorhandler Called";
    }
    //Eventhandlers


    //Getters, Setters
}
  

И в MXML:

 <fx:Script>
    <![CDATA[
        import argoseye.main.Golem;
        import argoseye.main.Schem;

        import mx.collections.ArrayCollection;
        import mx.rpc.AsyncToken;
        import mx.rpc.Responder;
        import mx.rpc.events.FaultEvent;
        import mx.rpc.events.ResultEvent;
        import mx.rpc.remoting.RemoteObject;

        [Bindable]
        private var schem:Schem;

        protected function button1_clickHandler(event:MouseEvent):void
        {
            schem = new Schem();
            schem.loadCurrentSchem();
        }

    ]]>
</fx:Script>
<s:Label id="textfeld" text="{schem.info}" />
  

Надеюсь, это поможет! 🙂

Комментарии:

1. Это действительно помогло. Используя ваш метод, я обнаружил, что мой класс действует вполне функционально, и проблема заключается в передаче результатов другим классам. Я попробую другой подход для этого. (Привязка)