Flex Give Да / Нет, флажок для снятия флажка - PullRequest
1 голос
/ 21 ноября 2011

Я хочу показать пользователю окно подтверждения при снятии флажка. Мой код работает, хотя я думаю, что это немного взломать. Я слушаю флажок и показываю предупреждение. В зависимости от результата я установил флажок для повторной проверки.

Мой код

<?xml version="1.0"?>
<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009"   xmlns:s="library://ns.adobe.com/flex/spark" >
<fx:Script><![CDATA[
    import mx.controls.Alert;
    import mx.events.CloseEvent;

    private function handleCheckBoxChange(e:Event):void {
        if (!CheckBox(e.target).selected) {
            Alert.show("Are you sure you want to deselect?", "Confirm",
                Alert.YES | Alert.NO, null, handleAlert, null, Alert.YES);
        }
    }

    public function handleAlert(event:CloseEvent):void {
        if (event.detail == Alert.YES) {
            trace("yes clicked");
        }
        else if (event.detail == Alert.NO) {
            cb1.selected = true;
            trace("no clicked");
        }
    }
    ]]></fx:Script>

    <s:CheckBox id="cb1" label="cb1" click="handleCheckBoxChange(event)"/>
</s:NavigatorContent>

Есть две вещи, которые мне не нравятся в этом

  1. код относится к cb1 и не может быть повторно использован для других флажков
  2. флажок снят, когда появляется предупреждение. Затем, когда пользователь нажимает нет, флажок устанавливается снова.

В идеале я хочу остановить событие снятия отметки, если пользователь нажимает нет в окне предупреждения. Можно ли перехватить это во Flex?

Спасибо

1 Ответ

2 голосов
/ 21 ноября 2011

Одно решение для ваших двух проблем: Создайте собственный класс, расширяющий CheckBox.Вы не можете использовать e.stopImmediatePropagation() в click Событии, потому что ваш добавлен позже.Однако, если вы проследите, вы увидите, что в ToggleButtonBase (который является родительским для CheckBox) содержится защищенная функция с именем buttonReleased;эта функция выполнит изменение значения selected и отправит событие change.Все, что вам нужно сделать в новом классе, это переопределить эту функцию.

public class AlertCheckBox extends CheckBox
    {
        public function AlertCheckBox()
        {
            super();
        }

        override protected function buttonReleased():void
        {
            if (selected) {
                Alert.show("Are you sure you want to deselect?", "Confirm",
                    Alert.YES | Alert.NO, null, handleAlert, null, Alert.YES);
                return;
            }

            super.buttonReleased();
        }

        public function handleAlert(event:CloseEvent):void {
            if (event.detail == Alert.YES) {
                selected = false;
            }
        }
    }
...