开发者

Order of calls to set functions when invoking a flex component

开发者 https://www.devze.com 2022-12-27 00:16 出处:网络
I have a component called a TableDataViewer that contains the following pieces of data and their associated set functions:

I have a component called a TableDataViewer that contains the following pieces of data and their associated set functions:

        [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);
        }

This component is nested in another component as follows:

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

Looking at the trace in the logs, the call to set table is coming before the call to set dataSetLoader. Which is a real shame because set table() needs dataSetLoader to already be set in order to call its load() function.

So my question is, is there a开发者_JAVA技巧 way to enforce an order on the calls to the set functions when declaring a component?


The Flex documentation mentions (somewhere, I can't find it al the moment) that the order of initialisation of properties set in MXML is undefined. That is, sometimes dataSetLoader might have its value set first and then table, or sometimes the other way round.

To get around this you can use the Flex invalidation methods like invalidateProperties() and invalidateDisplayList() to wait until all of your properties are set and then perform your processing all at once.

As an example, here is how you might handle your issue.
Note that we move the call to the _dataSetLoader.load(...) method to the commitProperties() method, when we know we have both the table and dataSetLoader values:

    [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;
        }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消