2011-05-27 116 views
1

赫雷什的代码:如何在外部类中实现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> 

有。

+0

你确定你的端点正在被击中? – 2011-05-27 17:35:14

+0

是的,我。有两个原因。第一:这个代码完全适用于应用程序脚本标签,第二:BlazeDS控制台计算成功的调用。 – Kai 2011-05-27 17:41:10

+0

您是否尝试订阅“故障”事件?也许结果处理程序不会因为某些你根本听不到的错误而调用? – Constantiner 2011-05-27 17:57:27

回答

0

问题是你没有适当的确保正确调用结果处理程序。问题是,当你使用:

textfeld.text = schem.info; 

你设置的值:

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

为文本字段的文本,该值是不是在结果的处理程序改变。

可以解决这个问题至少有两个方面:

  • EventDispatcher和发生的事件的元数据有扩展您的Schem类。

类:

[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}" /> 

希望这有助于! :)

+0

确实有帮助。使用你的方法,我发现我的类非常实用,问题是将结果传递给其他类。我会尝试一种不同的方法来做到这一点。 (捆绑) – Kai 2011-05-28 00:05:44