将从解析器和视图更新程序中检索数据的类去耦

时间:2011-07-16 17:11:00

标签: actionscript-3

我想创建一个处理Flash-PHP客户端 - 服务器通信的类。基本上,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方法的主体内部更新视图,但我想找到一个不同的解决方案。

这可能是解决这个问题的好方法吗?

编辑:我找到了better piece of code,但似乎这里的问题是一样的。

3 个答案:

答案 0 :(得分:0)

发送活动。 这是解耦代码的一种有效方法。

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

dispatchEvent(new Event(MYEVENT));

在使用此类的代码中,您将收听如下事件:

var csManager:CSManager=new CSManager();
csManager.addEventListener(MYEVENT,myHandler);

你也需要常量字符串

const MYEVENT:String ="MYEVENT";

在某处明确定义(如CSManager的静态类属性)

只是为了澄清,我不是建议你把你的事件称为MYEVENT,你可以将它改为更有意义的东西,比如STRAWBERRIES_AND_CREAM或在你的特定环境中有意义的事情。

答案 1 :(得分:0)

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

您将在“模型”中进行客户端/服务器通信,并在收到答案后向视图发送事件/通知。模型不必是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);
   }
 }

或者您可以使用puremvcrobotlegs等框架 - 这是构建应用程序的良好起点...

答案 2 :(得分:0)

我写了一篇关于这个确切主题的blog post - 希望它能提供一些有用的阅读!简而言之,Tom正在挣钱 - 如果Loader在数据准备好收集时调度COMPLETE事件,Mediator(一个将View与应用程序的其余部分分离的类)可以提供数据到视图。