Документация 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;
}
}