代码之家  ›  专栏  ›  技术社区  ›  mway

AS3/flex 4:查找嵌套子级的最实用方法

  •  3
  • mway  · 技术社区  · 14 年前

    我有点像在头上跳来跳去,先找些弹性/空气的东西。我对AS3有着相当扎实的背景,但是考虑到flex固有的层次复杂性(与普通flash相比),我遇到了一个问题。

    假设您有一个应用程序,其中几乎所有内容都是事件驱动的(公共)。访问事件目标或事件目标本身附近的元素非常简单。然而,我正试图找到最实际(读:最好,最有效)的方法来寻找远离当前环境的孩子。

    我知道有这样的功能 getChildAt() getChildByName() ,但这假设了父上下文;如果您要查找的元素(flex)是几个父元素向上、在一个兄弟中,然后是几个子元素向下呢?我们认为像jquery这样容易做到的事情是理所当然的,但显然我们在AS3中没有这样的奢侈。

    以下内容是否有效?有更好的方法吗?

    1. 反复访问父母和父母的父母,直到找到一个停止点,找到兄弟姐妹,并反复访问孩子和他们的孩子,直到找到目标为止;

    2. 将关键对象保存在全局对象存储(SIC)中,并根据需要引用它们(Yech)

    3. 使用特定的点表示法到达目标,包括元素(如皮肤及其容器-Yech)。

    任何想法都会被感激的。

    编辑:

    为了澄清这一点,让我们用一个空的flex 4-air应用程序。我们有 WindowedApplication 显然,作为根,我们加上两个 SkinnableContainer 具有ID的儿童 navContainer mainContainer ,分别。两者都有自定义外观。内 主容器 我们还有一个 可剥皮容器 具有垂直布局和ID mainContent 作为它的一个孩子,它有一个物体 BorderContainer ,也许)有身份证 animatedBox 例如。内 导航集装箱 我们有火花 Button ,其中有一个侦听器 MouseEvent.CLICK . 在这个函数中,我们将要访问 动画盒 ( nativeWindow.mainContainer.mainContent.animatedBox )并通过动画改变它,比如说,它的宽度。

    我们的目标是到达那个遥远的地方 DisplayObject ( 动画盒 )以一种尽可能不引人注目和高效的方式,同时仍然符合我显然还没有拥有的灵活标准。:)

    3 回复  |  直到 13 年前
        1
  •  1
  •   www0z0k    14 年前

    private function onClick(e:MouseEvent):void{
        Radio.broadcast(new CustomEvent(id, ..params));
    }
    

    Radio.addListener(id, new Reciever(uid, animate));
    
    private function animate(e:CustomEvent) {
       //needed code and access of CustomEvent props you pass
    }
    

    package lazylib.broadcast 
    {
        /**
         * ...
         * @author www0z0k
         */
        public class Reciever 
        {
            private var id: String;
            private var toRun: Function;
            /*@param nm - unique listener id - required
             *@param fn - event handler function - required*/
            public function Reciever(nm:String, fn:Function) 
            {
                id = nm;
                toRun = fn;         
            }
    
            public function onEvent(e:* = null):String {
                if (e == null) { return id; }
                toRun(e);
                return id;
            }
    
            public function get ID():String { return id; }
    
        }
    
    }
    

    package lazylib.broadcast
    {
        import flash.events.Event;
        import flash.events.EventDispatcher;
        /**
         * ...
         * @author www0z0k
         */
        public final class Radio extends EventDispatcher
        {
            private static var listeners: Object = new Object();
            private static var archive: Array = new Array();
            private static var forSlowpokes: Object = new Object();
    
            public static function get ForSlowpokes():Object { return forSlowpokes; }
    
            public static function addListener(type: String , listener: Reciever):Boolean {
                listeners['anchor'] = null;
                if (!listeners[type]) { 
                    var o: Object = new Object();
                    listeners[type] = o;
                }
                if (!listeners[type][listener.ID]) {
                    listeners[type][listener.ID] = listener; 
                    return true;
                }else {
                    return false;
                }
            }
    
            public static function broadcast(evt: * , singleUse:Boolean = false):void {
                var type:String = (evt as Event).type;          
                if (listeners[type]) {
                    var returned: Array = new Array();
                    for (var i: String in listeners[type]) {
                        if(listeners[type][i]){
                            var fnRetVal: String = listeners[type][i].onEvent(evt);
                            returned.push(fnRetVal);
                        }else{
                            //trace("no listener for id = " + i + ' , type = ' + type);
                        }
                    }
    
                }else {
                    //trace("nobody's interested in : \"" + type + "\"");
                }
                if (singleUse) {
                    forSlowpokes[type] = 'you missed it realtime';
                    delete listeners[type];
                }
            }
    
            public static function clearDeadFuncs(namez:Object):void {
                for (var a:String in namez) {
                    if (a != 'anchor') {
                        killListener(a, namez[a]);
                    }
                }
            }
    
            public static function killListener(type: String , id: String):Boolean {
                if (!listeners[type]) { 
                    //trace("there are no listeners for event : " + "\"" + type + "\"");
                    return false;
                }else {
                    if (!listeners[type][id]) {
                        //trace("there is no \"" + id + "\" listener for event : " + "\"" + type + "\"");
                        return false;
                    }else {
                        listeners[type][id] = null;
                        //trace("removed listener \"" + id + "\" for event : " + "\"" + type + "\"");
                        var evt2kill: Number = 0;
                        for (var str: String in listeners[type]) {
                            if (listeners[type][str]) {
                                evt2kill++;
                            }
                        }
                        if (evt2kill == 0) {
                            delete listeners[type];
                            //trace("no more listeners for event : " + "\"" + type + "\"");
                            return true;
                        }
                        return true;
                    }
                }
            }
        }
    }
    

        3
  •  0
  •   Chris    13 年前