好吧,我有一个疯狂的解决方法,但它非常稳固。我将在这里几乎完整地发布它,尽管我可能会将它通用化并在某些时候将其上传到github。
在我的shell中,我有一个视图与调解器(我使用robotlegs),我打电话给EventRelayer和EventRelayerMediator。
视图的唯一目的是给舞台上的中介服务。
我暴露在使用parentSandboxBridge一些功能:
public function requestKeyboardEventRelay(eventType:String, callback:Function):void;
public function requestMouseEventRelay(eventType:String, callback:Function):void;
public function cancelKeyboardEventRelay(eventType:String, callback:Function):void;
public function cancelMouseEventRelay(eventType:String, callback:Function):void;
我的沙箱桥永远都只是转换成强类型的事件,所以这些火灾的事件,如:
RelayEvent(RelayEvent.START_RELAY_REQUESTED, KeyboardEvent, eventType, callback);
RelayEvent(RelayEvent.CANCEL_RELAY_REQUESTED, MouseEvent, eventType, callback);
这些由EventRelayerMediator回升并在事件图中翻译成处理程序:
override public function onRegister():void
{
createRelayHandlerFactories();
eventMap.mapListener(eventDispatcher, RelayEvent.START_RELAY_REQUESTED, startRelay);
}
protected function startRelay(e:RelayEvent):void
{
var handler:Function = createRelayHandler(e.relayEventClass, e.callback);
eventMap.mapListener(view.stage, e.relayEventType, handler, e.relayEventClass);
}
protected function createRelayHandler(relayEventClass:Class, callback:Function):Function
{
var handler:Function = relayHandlerFactoriesByEventClass[relayEventClass](callback);
return handler;
}
protected function createRelayHandlerFactories():void
{
relayHandlerFactoriesByEventClass = new Dictionary();
relayHandlerFactoriesByEventClass[KeyboardEvent] = createKeyboardEventRelayHandler;
relayHandlerFactoriesByEventClass[MouseEvent] = createMouseEventRelayHandler;
}
protected function createKeyboardEventRelayHandler(callback:Function):Function
{
var handler:Function = function(e:KeyboardEvent):void
{
trace("Relaying from shell: " + e.toString());
// passing an object because the sandbox bridge doesn't allow strong typed values, only primitives
var o:Object = {};
o.type = e.type;
o.charCode = e.charCode;
o.keyCode = e.keyCode;
o.altKey = e.altKey;
o.ctrlKey = e.ctrlKey;
o.shiftKey = e.shiftKey;
// no point adding other props as we can't pass them
// to the constructor of the KeyboardEvent
callback(o)
}
return handler;
}
加载的swf传递一个只是重新组装并重新分派事件的回调。
我的输入TextField现在只是一个动态字段,它带有一个单击处理程序,它激活监听swf根上的键盘事件,然后相应地更新动态字段。
现在是超级原油,但我现在将它分解成一个强大的,经过测试的类,现在我知道它的工作原理。
我已经使用了字典来管理处理程序,因为我确信内存泄漏地狱即将跟随,我期望不得不转接FocusEvents以停止输入文本。
我需要测试内存泄漏,从parentSandboxBridge函数返回一个绑定,以便我可以确保我不会添加相同的处理程序两次等等,但是Adobe - 你会因为不会调用它并提供一个内置的在中继机制。
疯狂但不错的解决方法 – 2011-02-23 09:03:51