Порядок вызовов для установки функций при вызове flex-компонента - PullRequest
0 голосов
/ 14 апреля 2010

У меня есть компонент, называемый TableDataViewer, который содержит следующие фрагменты данных и связанные с ними функции набора:

        [Bindable]
        private var _dataSetLoader:DataSetLoader;
        public function get dataSetLoader():DataSetLoader {return _dataSetLoader;}
        public function set dataSetLoader(dataSetLoader:DataSetLoader):void {
            trace("setting dSL"); 
            _dataSetLoader = dataSetLoader;
        }

        [Bindable]
        private var _table:Table = null;
        public function set table(table:Table):void {
            trace("setting table");
            _table = table;
            _dataSetLoader.load(_table.definition.id, "viewData", _table.definition.id);
        }

Этот компонент вложен в другой компонент следующим образом:

<ve:TableDataViewer width="100%" height="100%" paddingTop="10" dataSetLoader="{_openTable.dataSetLoader}"
    table="{_openTable.table}"/>

Глядя на трассировку в журналах, вызов для установки таблицы происходит перед вызовом для установки dataSetLoader. Что является настоящим позором, потому что set table () требует, чтобы dataSetLoader уже был установлен для вызова его функции load ().

Итак, мой вопрос: есть ли способ обеспечить порядок вызовов функций set при объявлении компонента?

1 Ответ

0 голосов
/ 14 апреля 2010

Документация Flex упоминает (где-то, я не могу найти это все время), что порядок инициализации свойств, установленных в MXML, не определен. То есть иногда dataSetLoader может быть сначала установлено значение, а затем table, а иногда наоборот.

Чтобы обойти это, вы можете использовать методы аннулирования Flex, такие как invalidateProperties () и invalidateDisplayList () , чтобы подождать, пока не будут установлены все ваши свойства, а затем выполнить всю обработку сразу.

В качестве примера, вот как вы можете решить вашу проблему.
Обратите внимание, что мы перемещаем вызов метода _dataSetLoader.load(...) в метод commitProperties(), когда мы знаем, что у нас есть значения table и dataSetLoader:

    [Bindable]
    private var _dataSetLoader:DataSetLoader;
    private var dataSetLoaderChanged:Boolean = false;
    public function get dataSetLoader():DataSetLoader {return _dataSetLoader;}
    public function set dataSetLoader(dataSetLoader:DataSetLoader):void{
        trace("setting dSL"); 
        _dataSetLoader = dataSetLoader;

        dataSetLoaderChanged = true;
        invalidateProperties();
    }

    [Bindable]
    private var _table:Table = null;
    private var tableChanged:Boolean = false;
    public function set table(table:Table):void {
        trace("setting table");
        _table = table;

        tableChanged = true;
        invalidateProperties();
    }

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

        if (tableChanged || dataSetLoaderChanged)
        {
            if (_dataSetLoader != null)
            {
                _dataSetLoader.load(_table.definition.id, "viewData", _table.definition.id);
            }

            tableChanged = false;
            dataSetLoaderChanged = false;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...