Actionscript 3 解耦从解析器和视图更新程序检索数据的类

Actionscript 3 解耦从解析器和视图更新程序检索数据的类,actionscript-3,Actionscript 3,我想创建一个类来处理flashphp客户机-服务器通信。基本上,Flash会在点击UI中的一个按钮后将一个变量发送给PHP,而PHP又会将一个值发送给Flash 该类可以类似于以下内容: package { import flash.net.URLLoader; import flash.net.URLVariables; import flash.net.URLRequest; import flash.net.URLRequestMethod; im

我想创建一个类来处理flashphp客户机-服务器通信。基本上,Flash会在点击UI中的一个按钮后将一个变量发送给PHP,而PHP又会将一个值发送给Flash

该类可以类似于以下内容:

package 
{
    import flash.net.URLLoader;
    import flash.net.URLVariables;
    import flash.net.URLRequest;
    import flash.net.URLRequestMethod;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    //
    public class CSManager extends MovieClip
    {
        //
        var scriptLoader:URLLoader;
        //
        public function CSManager()
        {
            scriptLoader = new URLLoader();
            scriptLoader.addEventListener(Event.COMPLETE, handleLoadSuccessful);
            scriptLoader.addEventListener(IOErrorEvent.IO_ERROR, handleLoadError);
        }
        //;
        public function handleLoadSuccessful($evt:Event):void
        {
            trace("Message sent.");
        }
        //
        public function handleLoadError($evt:IOErrorEvent):void
        {
            trace("Message failed.");
        }
        //
        public function sendLoad(variable):void
        {
            var scriptRequest:URLRequest = new URLRequest("http://mydomain/myapp/my.php");
            var scriptVars:URLVariables = new URLVariables();

            scriptVars.var1 = variable;

            scriptRequest.method = URLRequestMethod.POST;
            scriptRequest.data = scriptVars;

            scriptLoader.load(scriptRequest);
        }

    }

}
因此,我设想在按钮调用的方法体中,我实例化这个类并调用CSManager sendLoad方法

如您所见,sendLoad向服务器发送数据,有两个方法处理结果。 当收到数据时,应用程序应该解析结果并更新视图,但我想让这个类与解析器和更新视图的类分离,并且只用于从服务器检索数据。 这特别意味着我不想从handleLoadSuccessful方法的主体内部解析数据和更新视图,但我想找到一个不同的解决方案

哪种方法可以很好地解决这个问题

编辑:我发现了一个,但这里的问题似乎是相同的。

调度一个事件。这是一种有效的代码解耦技术

您的类扩展了MovieClip,MovieClip扩展了Sprite,Sprite扩展了InteractiveObject,后者扩展了EventDispatcher。这意味着您的对象是EventDispatcher,因此可以调度事件:

dispatchEvent(new Event(MYEVENT));
在使用此类的代码中,您将听到如下事件:

var csManager:CSManager=new CSManager();
csManager.addEventListener(MYEVENT,myHandler);
还需要常量字符串

const MYEVENT:String ="MYEVENT";
定义为CSManager的静态类属性

我只是想澄清一下,我并不是建议你把你的活动称为MYEVENT,你可以把它改成更有意义的东西,比如草莓和奶油,或者在你的特定环境中有意义的任何东西。

你听说过吗?如果没有,请通读维基百科页面以更好地理解这一点

您将在模型中进行客户机/服务器通信,并在收到响应后向视图发送事件/通知。模型不必是movieclip,因为它没有视觉表示——只是一个普通类。如果要触发事件,可以从EventDispatcher进行扩展

public class MyModel extends EventDispatcher
{
   // ...

   private function onDate(evt:Event):void
   {
     // check if data was returned ...
     dispatchEvent(new MyEvent("dataReceived", data);
   }
}
视图应该侦听dataReceived事件

public class MyView extends MovieClip
{
   // ...

   public function MyView(model:MyModel)
   {
     // check if data was returned ...
     model.addEventListener("dataReceived", updateView);
   }

   private function updateView(evt:MyEvent):void
   {
      // parse data and do sth with it
   }
}
您将拥有一个主类,在其中实例化所有内容:

public class Main extends MovieClip
{
   private var model:MyModel;
   private var view:MyView;

   public function Main()
   {
      model = new MyModel();
      view = new MyView(model);
   }
 }

或者你可以使用像或这样的框架——这是一个很好的起点,可以在上面构建你的应用程序……

我写了一篇关于这个主题的文章——希望它能提供一些有用的阅读资料!简而言之,Tom赚了大钱——当数据准备好收集时,你是否让Loader分派一个完整的事件,一个将视图与应用程序其余部分解耦的类,然后可以将数据提供给视图。

这是一个非常有趣的观点,但我如何从result/fault方法获取数据?我假设您的想法是将dispatch事件放在result/fault方法的主体中。有两个选项,一个是创建一个自定义事件类扩展事件,该事件包含您需要的数据,并分派该事件的一个实例。另一种方法是只为要访问的数据(即CSManager上的数据)提供一个方法/属性。这是最简单的解决方案,仍然提供了所需的解耦。首先,对您与我轻松共享的代码进行一点修改:在addEventListener中,它对我来说是字符串事件,而不是MYEVENT。我完全理解第一个选项,而第二个选项听起来有点模糊:你能提供更多的见解吗?是的,MYEVENT只是一个例子!我建议您想出一些更有意义的方法,或者使用许多预定义事件中的一个,例如COMPLETE。好的,但是第二个选项解释了吗-即使不读维基百科,我也知道一点MVC;-我的问题严格地考虑AS3,以及您可以在这种情况下使用它并在多个项目上重用代码的方式。