Actionscript 3 解耦从解析器和视图更新程序检索数据的类
我想创建一个类来处理flashphp客户机-服务器通信。基本上,Flash会在点击UI中的一个按钮后将一个变量发送给PHP,而PHP又会将一个值发送给Flash 该类可以类似于以下内容: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
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,以及您可以在这种情况下使用它并在多个项目上重用代码的方式。