Apache flex Flex/ActionScript3-对象属性/变量null
如果我在FlashBuilder中执行下面的代码,我会得到以下错误(我翻译它) NumDisplay.mxml中的这一行是问题所在:Apache flex Flex/ActionScript3-对象属性/变量null,apache-flex,actionscript-3,object,null,components,Apache Flex,Actionscript 3,Object,Null,Components,如果我在FlashBuilder中执行下面的代码,我会得到以下错误(我翻译它) NumDisplay.mxml中的这一行是问题所在: [Bindable] public var oneled_top:OneDisplay = new OneDisplay(numberData.led_top); 如果我将其从上面更改为: [Bindable] public var oneled_top:OneDisplay = new OneDisplay(1); 它正在工作,因为我发送了一个真实的数字。
[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(numberData.led_top);
如果我将其从上面更改为:
[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(1);
它正在工作,因为我发送了一个真实的数字。
那么,如何从numberData.led\u top访问值呢
如果我用行测试samefileNumDisplay.mxml中的访问
<s:Label text="{numberData.led_top}" color="#FF0000">
</s:Label>
我的NumDisplay.mxml:
<?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="600" minHeight="500" xmlns:components="components.*">
<fx:Script>
<![CDATA[
import components.NumberDisplay;
[Bindable]
protected var firstNumber:NumberDisplay = new NumberDisplay(1);
[Bindable]
protected var secondNumber:NumberDisplay = new NumberDisplay(2);
]]>
</fx:Script>
<components:NumDisplay
numberData="{firstNumber}"
x="10"
y="20"/>
<components:NumDisplay
numberData="{secondNumber}"
x="73"
y="20"/>
</s:Application>
package components
{
import flash.display.DisplayObject;
[Bindable]
public class NumberDisplay
{
public var num:Number;
public var led_top:Number=0;
public var led_r1:Number=0;
public var led_r2:Number=0;
public var led_middle:Number=0;
public var led_l1:Number=0;
public var led_l2:Number=0;
public var led_bottom:Number=0;
public function NumberDisplay(num:Number)
{
this.num = num;
switch(this.num)
{
case 0:
trace("ZERo");
break;
case 1:
led_top = 1;
led_r1 = 1;
led_r2 = 1
trace("EINS" + led_top + " num:" + num);
break;
//[... some more cases]
default:
break;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="45" height="59"
xmlns:components="components.*">
<fx:Style>
@namespace s "library://ns.adobe.com/flex/spark";
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace components "components.*";
</fx:Style>
<fx:Script>
<![CDATA[
import components.NumberDisplay;
import components.OneDisplay;
[Bindable]
public var numberData:NumberDisplay;
[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(numberData.led_top);
// some more init calls of data-objects same type
]]>
</fx:Script>
<s:Label text="{numberData.led_top}" color="#FF0000">
</s:Label>
<components:oneLedDisplay showData="{oneled_top}" x="10" y="10" />
// some more objects of same type
</s:Group>
MyoneLedDisplay.mxml:
package components
{
import flash.display.DisplayObject;
public class OneDisplay
{
[Bindable]
public var show:Number;
[Bindable]
public var value:Number=0;
public function OneDisplay(show:Number)
{
this.show = show;
switch(this.show)
{
case 0:
value = 0.3;
trace(value);
break;
case 1:
value = 1.0;
trace(value);
break;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
import components.OneDisplay;
[Bindable]
public var showData:OneDisplay;
]]>
</fx:Script>
<s:Rect id="stroke" width="40" height="6" alpha="{showData.value}">
<s:fill>
<s:SolidColor color="#000000"/>
</s:fill>
</s:Rect>
<s:Label text="{showData.value}" color="#FF0000">
</s:Label>
</s:Group>
请记住,您不仅要赋值,还要声明成员变量oneled\u top
。此时,您无法访问numberData
,因为它尚未实例化(没有调用newnumberdata()
!您必须找到一种方法来调用newonedisplay(numberData.led\u top)
以后,当实际有一个值要访问时。请记住,您不仅要赋值,而且要声明成员变量oneled\u top
。此时,您无法访问numberData
,因为它尚未实例化(没有调用new numberData()
!您必须找到一种方法,以便在以后实际有值可访问时调用新的OneDisplay(numberData.led\u top)。您提供了许多我不想反向工程的代码
答案是oneled_top在numberData之前被初始化。使用MXML时,您无法控制变量的初始化
在commitProperties()方法中设置默认值,或者如果oneled_Top应该是蒙皮零件,则在PartAdded方法中设置默认值
您将从阅读中受益。您提供了许多我不想反向工程的代码 答案是oneled_top在numberData之前被初始化。使用MXML时,您无法控制变量的初始化 在commitProperties()方法中设置默认值,或者如果oneled_Top应该是蒙皮零件,则在PartAdded方法中设置默认值
您将从阅读中受益。您可以使用
BindingUtils.bindSetter()
检测对numberData
的更改,然后初始化oneled\u top
BindingUtils.bindSetter(_setOneLabel_top, this, "numberData");
和塞特:
function _setOneLabel_top(disp:NumberDisplay):void
{
/* if(this.oneled_top == null) */
this.oneled_top = new OneDisplay(disp.led_top);
}
但我认为,您在不需要的地方使用了
[Bindable]
。您可以使用BindingUtils.bindSetter()
来检测对numberData
的更改,然后初始化oneled\u top
BindingUtils.bindSetter(_setOneLabel_top, this, "numberData");
和塞特:
function _setOneLabel_top(disp:NumberDisplay):void
{
/* if(this.oneled_top == null) */
this.oneled_top = new OneDisplay(disp.led_top);
}
但我认为,您在不需要的地方使用了
[Bindable]
。+1为这个问题提供了一个可靠的解释。就未来有价值可访问的时间而言,我建议使用commitProperties()(正如我在回答中所做的那样).+1对该问题进行了可靠的解释。就未来有值可访问的时间而言,我建议使用commitProperties()(正如我在回答中所做的那样)。