Flex Lazy Binding

Вдохновленный возможностями ленивой загрузки 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>
5
задан Sam DeHaan 30 March 2012 в 19:09
поделиться