我想创建一个处理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,但似乎这里的问题是一样的。
答案 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)
您将在“模型”中进行客户端/服务器通信,并在收到答案后向视图发送事件/通知。模型不必是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);
}
}
答案 2 :(得分:0)