Вдохновленный возможностями ленивой загрузки Hibernate, я хотел сделать модель частью моего пользовательского интерфейса Flex и запрашивать данные с сервера только тогда, когда это необходимо. Я думал, что это будет так же просто, как добавить общедоступный метод доступа, который отправляет запросы к серверу только при доступе к переменной.
public function get tab2AC():ArrayCollection
{
if(_tab2AC == null){
//Request data from server
}
return _tab2AC;
}
Проблема в том, что Flex, кажется, получает доступ ко всемсвязанным переменным при запуске приложения, даже если компонент ссылки еще не создан. Таким образом, несмотря на то, что DataGrid с dataProvider="{tab2AC}"
еще не создан, запрос к серверу все еще отправляется, тем самым преодолевая лень "только при необходимости".
Я не хочу размещать серверный запрос в обработчике createComplete, поскольку я хочу, чтобы моя модель пользовательского интерфейса не знала о состоянии представления, а мое представление — о запросах сервера.
Интересно, что если я добавлю Alert.show("что-нибудь");
внутрь аксессора, он будет работать как надо.
ОБНОВЛЕНИЕ: Вот полный пример. Установите точки останова, и вы увидите, что Flex обращается к обеим переменным, хотя titleForScreen2 не используется ни одним созданным компонентом.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
private var _titleForScreen1:String;
private var _titleForScreen2:String;
public function get titleForScreen1():String {
if(_titleForScreen1 == null){
//Server Request
}
return _titleForScreen1;
}
public function get titleForScreen2():String {
if(_titleForScreen2 == null){
//Server Request
}
return _titleForScreen2;
}
]]>
</fx:Script>
<mx:ViewStack>
<s:NavigatorContent label="Screen 1">
<s:Label text="{titleForScreen1}"/>
</s:NavigatorContent>
<s:NavigatorContent label="Screen 2">
<s:Label text="{titleForScreen2}"/>
</s:NavigatorContent>
</mx:ViewStack>
</s:Application>