Flex - передача данных в представления с вкладками
У меня есть проект, который имеет 4 представления, где я использую tabBar с viewStack/NavigatorContent. У меня есть пара HTTPServices, настроенных для сбора XML и преобразования в Bindable ArrayCollections. Когда и как лучше всего передать эти данные таким элементам, как диаграммы, таблицы данных и т. Д., Которые не видны до тех пор, пока пользователь не щелкнет вкладку? Прямо сейчас у меня есть каждый элемент, настроенный с функциями creationComplete, которые затем передают его. Хотя это, кажется, работает, это лучший способ, или есть что-то лучше, а может быть, даже быстрее?
Спасибо Марк
2 ответа
Лучший способ - использовать привязку данных. Скажем, у вас есть основной контейнер, который содержит ViewStack
компоненты ведьмы, представляющие содержание вкладок. Так что вы должны иметь [Bindable]
свойства для данных в главном контейнере, подобные следующим:
[Bindable]
private var chartData:ArrayCollection;
[Bindable]
private var dataGridData:ArrayCollection;
и т.п.
Поэтому для компонента, содержащего диаграмму, вы должны заполнить данные диаграммы привязкой данных:
<ViewStack>
…
<MyChartsTab chartData="{chartData}" />
…
</ViewStack>
И, конечно же, вы должны ввести то же самое chartData
поле (убедитесь, что это public
) в вашем MyChartsTab
составная часть. Ваши графики там могут быть заполнены привязкой данных.
Таким образом, после получения данных вы просто заполняете свои поля в главном компоненте, а связывание данных выполняет остальную работу, не заботясь об инициализации с вашей стороны.
При создании ваших представлений убедитесь, что вы разрешаете открытую переменную (например, "dataProvider"), где вы можете связать необходимые данные. Как это:
<mx:ViewStack>
<s:NavigatorContent>
<SomeComponent dataProvider="{someData}" />
</s:NavigatorContent>
<s:NavigatorContent>
<SomeComponent2 dataProvider="{someData}" />
</s:NavigatorContent>
</mx:ViewStack>
И в пользовательском компоненте у вас будет:
private var _data:Object; // use strong typing if possible
public function set dataProvider(value:Object):void // use strong typing if possible
{
this._data = value;
}
public function get dataProvider():Object
{
return this._data;
}