Flex / Actionscript: как изменить свойство (метку) всех кнопок? - PullRequest
1 голос
/ 21 июня 2010

Я новичок в Flex / Actionscript и у меня очень простой вопрос.

Допустим, у меня около 100+ кнопок.Все они имеют одинаковый ярлык.Теперь я хочу изменить ярлык для всех одним щелчком мыши.Я мог бы дать им идентификаторы и затем запустить цикл for, но я ищу более точное решение.

Спасибо за помощь.

Обновление:

Хм, это нене работает, потому что ярлык кнопок изменяется во время выполнения.Это код

public function changeButton(event:Event):void {
    if (event.target.label != 'X') {
    event.target.label ='X';
    } else {
    event.target.label ='';
    }
}

Теперь мне нужна кнопка, которая при нажатии удалит / заменит этот ярлык на пустой.

Ответы [ 2 ]

3 голосов
/ 21 июня 2010

Если вы используете Flex, вы можете использовать привязку данных:

[Bindable] myButtonLabel:String = "Default Label";

<mx:Label id="label1" text="{myButtonLabel}"/>
<mx:Label id="label2" text="{myButtonLabel}"/>

function buttonClick(evt:Event):void {
    myButtonLabel = "New Label";
}

Каждый раз, когда вы меняете значение myButtonLabel, все метки будут меняться.

1 голос
/ 21 июня 2010

Сверху головы я могу предложить вам несколько решений, в зависимости от вашего определения «аккуратный».Я полагаю, что «самое подходящее» - это отправка события.Но я обрисую в общих чертах все три:

1. Сам ярлык должен быть диспетчером событий или каким-либо объектом, который может уведомить все, что «помечено», своим конкретным значением.Конечно, это можно рассматривать как вариант решения № 3, но это НЕТ.Ваши кнопки будут регистрировать слушателей на назначенной им метке, и, сделав операцию изменения метки, отправит событие изменения, ваши кнопки получат возможность обновить отображение своей метки.Это удобно, потому что вы можете иметь многократно используемый шаблон программирования:дорожка кнопок с одинаковой меткой в ​​контейнере, которая легко перебирается, например, словарь (нужны слабые клавиши, чтобы вектор не подходил!)

class Button
{
    static var buttons_by_label: Dictionary;

    static function init_class()
    {
        buttons_by_label = new Dictionary(true);
    }

    static function reset_identical_labels(old_value: String, new_value: String)
    {
        if(buttons_by_label[old_value] === undefined)
        {
            throw new Error("No buttons with specified label value.");
        }

        for(var button: Button in buttons_by_label[old_value])
        {
            button.label = new_value;
        }
    }

    var label_tf: TextField;

    public function Button(label: String)
    {
        this.label = label;
    }

    public function get label()
    {
        return label_tf.text;
    }

    public function set label(new_value: String)
    {
        var old_value: String = label_tf.text;

        if(buttons_by_label[old_value] !== undefined)
        {
            delete buttons_by_label[old_value][this];
        }

        if(buttons_by_label[new_value] === undefined)
        {
            buttons_by_label[new_value] = new Dictionary(true);
        }

        buttons_by_label[new_value][this] = true;

        label_tf.text = new_value;
    }
}

Button.init_class();

var button1 = new Button("Cancel");
var button2 = new Button("Cancel");
var buttonN = new Button("Cancel");

Button.reset_identical_labels("Cancel", "Anular");

3.Используйте преимущества списка отображенияиерархия и модель потока событий, чтобы Flash Player выполнял большую часть работы за вас:

class Button
{        
    var label_tf: TextField;

    public function Button(label: String)
    {
        this.label = label;

        stage.addEventListener("request.button.update_label", 
            on_update_label_request_event, 
            false, 0,true);
    }

    public function get label()
    {
        return label_tf.text;
    }

    public function set label(new_value: String)
    {            
        label_tf.text = new_value;
    }

    function on_update_label_request_event(event: LabelUpdateRequestEvent)
    {
        if(label == event.old_value)
        {
            label = event.new_value;
        }
    }
}

class LabelUpdateRequestEvent extends Event
{
    public var old_value: String;
    public var new_value: String;

    public function LabelUpdateRequestEvent(old_value: String, new_value: String)
    {
        super("request.button.update_label");

        this.old_value = old_value;
        this.new_value = new_value;
    }
}

var button1 = new Button("Cancel");
var button2 = new Button("Cancel");
var buttonN = new Button("Cancel");

stage.dispatchEvent(new LabelUpdateRequestEvent("Cancel", "Anular"));

Я предлагаю вам изучить слабые и сильные стороны каждого из них - все они имеют и то и другое - и использоватьгибридное решение.Первый имеет эффект разделения значения метки со ссылкой на значение, то есть два разных объекта метки, оба с «Отмена», поскольку значение НЕ будет изменять друг друга, даже если метка фактически идентична.Два других решения не отделяют значение от ссылки.Однако с ними вы получаете дополнительную плату за добавление слишком большого числа слушателей событий с большим количеством кнопок, чего не может сделать второе решение.Это все было в моей голове, но у вас есть интересная проблема, используйте вашу фантазию сейчас: -)

...