Flex 4.5范围国家间的问题

时间:2011-05-29 23:18:03

标签: flex actionscript-3 flex4 flexbuilder states

我正在为不同的步骤创建一个具有几种不同状态的界面。对于这些步骤,我从数据库中提取数据以填充某些字段。

到目前为止,我正在进行一次数据库查询以获取所有数据,并希望同时填写所有字段,但它给了我“访问空对象引用”的权限。

当您尝试使用actionscript访问文本输入字段时,如果文本输入所处的状态不是当前状态,则似乎存在范围问题。

这有什么办法吗?

例如(这将抛出“空对象引用”错误):

<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 个答案:

答案 0 :(得分:3)

Flex仅在需要时才创建状态(甚至在您更改状态后它们都不可用,因为flex会等待下一个渲染周期来制作它们,从而优化过程)。这可能更难处理,但是,有时候,在更改状态之前或之后需要一些对象,因为这些对象使用itemCreationPolicy=immediate这会删除flex优化,但允许您立即使用该对象。 / p>

因此,要回答您的问题,在文本字段中添加itemCreationPolicy=immediate可以解决您的问题而无需任何额外的工作。

答案 1 :(得分:0)

Flex只会生成当前状态。因此,只有在创建textinput时才能调用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>