Как заполнить обязательные параметры в пользовательском теге MXML? - PullRequest
3 голосов
/ 18 мая 2009

Вот класс:

package fnc {
    import mx.containers.Canvas;

    public class Deck extends Canvas {

        protected var _chipCount:int;

        public function Deck(chipCount:int) {
            /* Associate some chips with this deck */
            _chipCount = chipCount;
        }

        public function get chipCount():int {
            return _chipCount;
        }
    }
}

Вот MXML:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*">
    <ns1:Deck horizontalCenter="0" verticalCenter="0">
    </ns1:Deck>
</mx:Application>

При запуске этого приложения появляется эта ошибка:

ArgumentError: Ошибка # 1063: Несоответствие счетчика аргументов в fnc :: Deck (). Ожидаемый 1, получил 0. в mx.core :: Container / createComponentFromDescriptor () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ core \ Container.as: 3579] в mx.core :: Container / createComponentsFromDescriptors () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ core \ Container.as: 3493] в mx.core :: Container / createChildren () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ core \ Container.as: 2589] в mx.core :: UIComponent / initialize () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as: 5370] в mx.core :: Container / initialize () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ core \ Container.as: 2526] в mx.core :: Application / initialize () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ core \ Application.as: 846] на практике / initialize () [C: \ Documents and Settings \ LocalService \ Мои документы \ Flex Builder 3 \ Practice \ src \ Practice.mxml: 0] на mx.managers :: SystemManager / http://www.adobe.com/2006/flex/mx/internal::childAdded()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2009] в mx.managers :: SystemManager / initializeTopLevelWindow () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ Manager \ SystemManager.as: 3234] на mx.managers :: SystemManager / http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3064] в mx.managers :: SystemManager / docFrameListener () [C: \ autobuild \ 3.2.0 \ frameworks \ projects \ framework \ src \ mx \ Manager \ SystemManager.as: 2916]

Добавление chipCount="0" в MXML следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*">
    <ns1:Deck chipCount="0" horizontalCenter="0" verticalCenter="0">
    </ns1:Deck>
</mx:Application>

Получает эту ошибку компиляции:

Серьезность и описание Путь Ресурс Местоположение Идентификатор времени создания Свойство chipCount доступно только для чтения. Practice / src Practice.mxml line 3 1242656555328 26

Как указать начальный счетчик фишек?

Ответы [ 3 ]

6 голосов
/ 18 мая 2009

Вы не можете передавать параметры конструктору элемента, когда объявляете его в MXML. Вам понадобится пустой конструктор, а затем свойство ChipCount. Ваш код также должен быть обновлен для обработки ChipCount, который не был установлен (или установлен в 0).

Я бы порекомендовал поменять колоду на что-то вроде этого:

public class Deck extends Canvas {

    protected var _chipCount:int;

    public function Deck() {
        _chipCount = 0; // Default ChipCount and wait for it to be set.
    }

    public function get chipCount():int {
        return _chipCount;
    }

    public function set chipCount(value:int):int {
        // Add logic here to validate ChipCount before setting.
        _chipCount = value;

    }
}
2 голосов
/ 19 мая 2009

В ответ на комментарий brd6644:

package
{
    import mx.containers.Canvas;

    public class Deck extends Canvas
    {
        protected var _chipCount:int;
        private var chipCountChanged:Boolean;

        public function Deck()
        {
            super();
        }

        public function set chipCount(value:int):void
        {
            if (chipCount != value)
            {
                _chipCount = value;
                chipCountChanged = true;
                invalidateProperties();
                //call invalidateSize() if changing chipCount value may change the size of your component
                //call invalidateDisplayList() if changing chipCount value need a redraw of your component
            }
        }

        public function get chipCount():int
        {
            return _chipCount;
        }

        override protected function commitProperties():void
        {
            super.commitProperties();

            if (chipCountChanged)
            {
                chipCountChanged = false;
                //here update properties that change because of chipCount new value.
            }
        }

    }
}
1 голос
/ 18 мая 2009

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

<?xml version="1.0" encoding="utf-8"?>
<mx:Script>
   public function setChipCount():void{
     myDeck.chipCount = 0;
   }
</mx:Script>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="fnc.*">
    <ns1:Deck id="myDeck" initalize="setChipCount()" horizontalCenter="0" verticalCenter="0">
    </ns1:Deck>
</mx:Application>
...