我正在为不同的步骤创建一个具有几种不同状态的界面。对于这些步骤,我从数据库中提取数据以填充某些字段。
到目前为止,我正在进行一次数据库查询以获取所有数据,并希望同时填写所有字段,但它给了我“访问空对象引用”的权限。
当您尝试使用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>
答案 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>