2


0

Flexの複数のオブジェクトのプロパティの変更

以下の私の例では、いくつかのオブジェクトがあります。 idで各要素を呼び出すことなく、すべてのオブジェクトのラベルを一度に変更したいです。 HTMLでこれを行う方法は知っていますが、Flexではできません。

// HTML
SomeText
SomeText
SomeText

// jQuery
$(".text").css("color", "#333333");

これは通常、3つのオブジェクトの色を1行で灰色に設定する方法です。

// Flex




// AS3
button1.label = 'Something else';
button2.label = 'Something else';
button3.label = 'Something else';

jQueryの例のような1行のコードで3つのボタンすべてのラベルを変更する方法はありますか? 前もって感謝します。

3 Answer


3


答えはノーだと確信していますが、注意が必要です。

JQueryは、実行中の複雑さを隠すフレームワークであることに注意してください。 (flex Frameworkを含む多くのフレームワークがこれを行います)。 Flexでは、1行のコードでDataGridを作成できます。 ただし、数千行のコードがあり、それを可能にする複数のクラスが既に作成されています。 同じことが多くのJQuery機能にも当てはまると思います。

その機能をカプセル化して変更を加えてから1行のコードで呼び出すことができない理由はありません。


1


@ www.Flextras.comが指摘したように、これを行うクラスを書くことができます。

ただし、特定のプロパティを探している子供をループするのは非常に遅いため、別のアプローチを検討することをお勧めします。 とはいえ、それは興味深いコーディングの課題になります。

以下は、あなたが望んでいることを実現するはずのクラスと例です。

package com.mangofactory.util
{
    import flash.display.DisplayObject;

    import mx.core.UIComponent;

    /**
     * Utility class to set a given property of all matching children on a target.
     * Named to act as an operator, rather than a class (hence no captial letter)
     *
     * eg.,  on(someTarget).of(SomeClass).someProperty = someValue;
     * */
    public class on
    {
        private var root:UIComponent;
        private var requiredPropertyName:String;
        private var requiredType:Class;

        public function on(root:UIComponent)
        {
            this.root = root;
        }
        /**
         * Returns a list of targets which match the defined criteria.
         * Note - the root component is also evaluated
         * */
        private function get targets():void
        {
            var result:Array = [];
            if (matches(root))
            {
                result.push(root);
            }
            for (var i:int = 0; i < root.numChildren; i++)
            {
                var child:DisplayObject = root.getChildAt(i);
                if (matches(child))
                    result.push(child);
            }
        }
        /**
         * Returns true if the target param matches the defined criteria.
         * If a propertyName has been given (by calling 'having') that is checked first.
         * Otherwise, the type is checked against the value passed calling ('of')
         * */
        private function matches(target:Object):Boolean
        {
            if (requiredPropertyName && target.hasOwnProperty(requiredPropertyName))
                return true;
            if (requiredType && target is requiredType)
                return true;
            return false;

        }
        public function having(propertyName:String):PropertyCatcher
        {
            this.requiredPropertyName = propertyName;
        }
        public function setOnTargets(propertyName:*,value:*):void
        {
            for each (var matchedTarget:Object in targets)
            {
                if (matchedTarget.hasOwnProperty(propertyName))
                    matchedTarget[propertyName] = value;
            }
        }
        public function of(type:Class):PropertyCatcher
        {
            this.requiredType = type;
        }
    }
}
import com.mangofactory.util.on;

import flash.utils.Proxy;
import flash.utils.flash_proxy;
use namespace flash_proxy;

dynamic class PropertyCatcher() extends Proxy
{
    private var callbackTarget:on;
    public function PropertyCatcher(callbackTarget:on)
    {
        this.callbackTarget = callbackTarget;
    }
    override flash_proxy function setProperty(name:*, value:*):void {
        callbackTarget.setOnTargets(name,value);
    }
}

そして例:

            public function doTest():void
            {
                // Sets the label of all Buttons to "Hello World"
                on(this).of(Button).label = "Hello World";
                // Sets the visible property of all children which declare a "alpha" property to false.
                on(this).having("alpha").visible = false;
            }

注-私はこれをテストしていませんが、理論的には動作するはずです。


0


flexのcss3 / jqueryタイプのセレクターは知りません。 しかし、回避策は、多くのボタン変数の代わりにボタンの配列を使用し、それらすべてを繰り返すだけです(buttoniの代わりにbutton [i])