Проблема области действия Flex 4.5 между состояниями - PullRequest
1 голос
/ 30 мая 2011

Я создаю интерфейс, который имеет несколько разных состояний для разных шагов. Для этих шагов есть данные, которые я извлекаю из базы данных для заполнения определенных полей.

На данный момент я делаю один запрос базы данных, чтобы вернуть все данные, и хочу заполнить все поля одновременно, но это дает мне «доступ к нулевой ссылке на объект».

Кажется, что существует проблема с областью действия, когда вы пытаетесь получить доступ к текстовому полю ввода с помощью Actionscript, когда состояние, в котором находится текстовый ввод, не является текущим состоянием.

Есть ли способ обойти это?

Например (это выдает ошибку «Null object reference»):

<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"
           creationComplete="init()">
<s:states>
<s:State name="State1"/>
<s:State name="state2"/>
</s:states>
<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        protected function init(event:FlexEvent):void
        {
            ti_test.text = "Hello World";
        }

    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:TextInput id="ti_test" includeIn="state2" x="323" y="197"/>
</s:Application>

Ответы [ 2 ]

3 голосов
/ 30 мая 2011

Flex создает состояния только тогда, когда они необходимы (даже сразу после изменения состояния, которого они недоступны, потому что flex ожидает следующего цикла рендеринга, чтобы сделать их, таким образом, оптимизируя процесс).С этим может быть сложнее работать, однако иногда некоторые объекты необходимы до или сразу после изменения состояния, поскольку эти объекты используют itemCreationPolicy=immediate, что удаляет гибкую оптимизацию, но позволяет сразу использовать объект.

Итак, чтобы ответить на ваш вопрос, добавление itemCreationPolicy=immediate в текстовое поле должно решить вашу проблему без каких-либо дополнительных действий.

0 голосов
/ 30 мая 2011

Flex сделает только текущее состояние.Таким образом, вы можете вызывать функцию init () только при создании текстового ввода.Вы можете сделать это следующим образом:

<s:TextInput id="ti_test" includeIn="state2" creationComplete"init()" x="323" y="197"/>

Теперь вы говорите, что хотите поместить значение туда еще до того, как оно будет создано, я боюсь, что это невозможно.Что вам нужно сделать, это создать класс actionscript, который представляет объект вашей базы данных.Затем присвойте правильные значения экземпляру этого класса.И затем вы добавляете вот так:

<s:TextInput id="ti_test" includeIn="state2" text="{dataObject.textValue}" x="323" y="197"/>

Если вы действительно не хотите создавать класс, тогда вы можете просто поместить все различные переменные в ваше приложение и затем присвоить данные этому.Тогда у вас будет что-то вроде этого

<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"
           creationComplete="init()">
<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        [Bindable]
        var textValue:String;

        protected function init(event:FlexEvent):void
        {
            textValue = "Hello World";
        }

    ]]>
</fx:Script>
<fx:Declarations>

</fx:Declarations>

<s:states>
<s:State name="State1"/>
<s:State name="state2"/>
</s:states>
<s:TextInput id="ti_test" text="textValue" includeIn="state2" x="323" y="197"/>
</s:Application>
...