Progression on Flex でdynamicなparameterを持ったScene その2
昨日のコードだと、/root/some/foobarから/root/some/hogepiyoにGotoできないなー、と昨日布団に入ったときに気付いたので修正。
package jp.archilogic { import jp.progression.events.SceneEvent; import jp.progression.scenes.SceneObject; public class DynamicScene extends SceneObject { public function DynamicScene( name : String = null , initObject : Object = null ) { super( name , initObject ); } protected var param : String; private var child : Scene; override protected function _onLoad() : void { addPseudoScene(); load(); } override protected function _onUnload() : void { removePseudoScene(); unload(); } protected function childLoad() : void { } protected function childUnload() : void { } protected function load() : void { } protected function unload() : void { } private function addPseudoScene( additionalLoadHandler : Function = null ) : void { var paths : Array = progression.destinedSceneId.path.split( '/' ); param = paths[ paths.length - 1 ]; child = new Scene( param ); child.addEventListener( SceneEvent.LOAD , childLoadHandler ); child.addEventListener( SceneEvent.UNLOAD , childUnloadHandler ); if ( additionalLoadHandler != null ) { child.addEventListener( SceneEvent.LOAD , additionalLoadHandler ); } addScene( child ); } private function childLoadHandler( event : SceneEvent ) : void { childLoad(); } private function childUnloadHandler( event : SceneEvent ) : void { childUnload(); if ( sceneId.contains( progression.destinedSceneId ) ) { child.removeEventListener( event.type , arguments.callee ); var prev : Scene = child; addPseudoScene( function( event_ : SceneEvent ) : void { removeScene( prev ); } ); } } private function removePseudoScene() : void { child.removeEventListener( SceneEvent.UNLOAD , childUnloadHandler ); removeScene( child ); } } }
SceneIdのcontainsは普通逆だと思うやろーがー。
childUnloadHandlerのifの中で、シンプルにremovePseudo,addPseudoするとSceneManagerにnullだぞーと怒られる。現在のシーンは新しいシーンに遷移した後でないとremoveしてはいけないっぽいのでこのコード。
実際のパラメータの処理は、childLoad,childUnloadでするように変更