Расширение PopUpButton и использование его в веб-приложении Flex 4 - PullRequest
1 голос
/ 17 марта 2012

В моем веб-приложении Flex 4.6 я использую в основном компоненты spark, но есть также mx-компонент - расширенный мной PopUpButton (исходный код ниже).

Пользователисообщать о проблемах с этой кнопкой, но я не могу воспроизвести никаких - с недель.

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

Мой вопрос: почему Flash Builder выдает предупреждение омоя пользовательская кнопка, как если бы ее методы были частными или отсутствовали?

enter image description here

Кто-нибудь может определить причину?

Мой главный App.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application  
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    xmlns:comps="*">

    <fx:Script>
        <![CDATA[
                   _auxBtn.update(obj.aux);
                    ......
                   _auxBtn.disable();
        ]]>
    </fx:Script>

    <comps:AuxButton id="_auxBtn" enabled.normal="false" enabled.ingame="false" aux="handleAux(event)" />

Моя настраиваемая кнопка AuxButton.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:PopUpButton
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx"
    popUp="{_list}"
    initialize="init(event)">

    <fx:Metadata> 
        [Event(name="aux", type="PrefEvent")] 
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;
            import mx.utils.ObjectUtil;
            import spark.components.List;

            private const EXACT:String = 'Своя игра';
            private const REVEAL:String = 'Показать';

            private var _str:String;

            [Bindable]
            private var _data:ArrayCollection = new ArrayCollection();

            [Bindable]
            private var _list:List = new List();

            private function init(event:FlexEvent):void {
                _list.dataProvider = _data;
                _list.addEventListener('click', handleList);
                addEventListener('click', handleClick);
            }

            public function update(aux:Array):void {
                var found:Boolean;

                // nothing has changed
                if (ObjectUtil.compare(_data.source, aux, 0) == 0)
                    return;

                if (aux == null || aux.length == 0) {
                    disable();
                    return;
                }

                _data.removeAll();
                for each (var obj:Object in aux) {
                    _data.addItem(obj);

                    if (!_str) {
                        if (EXACT == obj['label']) {
                            _str  = obj['event'];
                            label = obj['label'];
                            found = true;
                        } else if (REVEAL == obj['label']) {
                            _str  = obj['event'];
                            label = obj['label'];
                            found = true;
                        }
                    } else if (_str == obj['event']) {
                            found = true;
                    }
                }

                if (!found) {
                    _str  = _data[0].event;
                    label = _data[0].label;
                }

                enabled = true;
            }

            private function handleList(event:MouseEvent):void {
                var index:int = _list.selectedIndex;
                if (index >= 0 && index < _data.length) {
                    _str  = _data[index].event;
                    label = _data[index].label;
                }
                close();
            }           

            private function handleClick(event:MouseEvent):void {
                dispatchEvent(new PrefEvent(PrefEvent.AUX, _str));
                disable();
            }

            public function disable():void {
                _data.removeAll();
                enabled = false;
                _str    = null;
                label   = '';
            }
        ]]>
    </fx:Script>
</mx:PopUpButton>

1 Ответ

1 голос
/ 17 марта 2012

Не беспокойтесь о предупреждениях Flash Builder, иногда возникают трудности с анализом пользовательского расширенного кода mx (иногда даже с искрой!). Если все работает нормально, предупреждения в конечном итоге исчезнут после очистки или перезапуска FB.

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

Будьте уверены, я вставил ваш код в Flash Builder (и удалил PrefEvent), на моем компьютере вообще нет предупреждений:)

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

Приветствия

...