如果我在FlashBuilder中执行以下代码,我会收到以下错误(我翻译它)
TypeError: Error #1009: Access to an Attribute or Method of an null-Object is not possible.
at components::NumDisplay()[\src\components\NumDisplay.mxml:39]
NumDisplay.mxml 中的这一行是问题所在:
[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(numberData.led_top);
如果我将其从上面更改为:
[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(1);
它正在工作,因为我发送了一个真实的号码。 那么如何从 numberData.led_top 中访问该值?
如果我使用
行测试同一文件 NumDisplay.mxml 中的访问权限<s:Label text="{numberData.led_top}" color="#FF0000">
</s:Label>
它访问该值,就像我把它放在我的组件中一样
<components:oneLedDisplay showData="{numberData.led_top}" x="10" y="10" />
经过几个小时的搜索,我得不到它...... 提前谢谢。
我的主要方法 tasachenrechner.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>
我的AS-Class NumberDisplay.as :
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;
}
}
}
}
我的 NumDisplay.mxml :
<?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>
我的AS-Class OneDisplay.as :
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;
}
}
}
}
我的 oneLedDisplay.mxml :
<?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>
答案 0 :(得分:4)
请记住,您不仅要分配值,还要声明成员变量oneled_top
。此时,您无法访问numberData
,因为它尚未实例化(没有new NumberData()
的来电!您必须在以后找到一种方法来拨打new OneDisplay (numberData.led_top)
,当实际存在要访问的值时。
答案 1 :(得分:2)
您提供了许多我不想逆向工程的代码。
答案是oneled_top正在numberData之前初始化。使用MXML时,无法控制变量的初始化。
在commitProperties()方法中设置默认值,或者如果oneled_Top应该是外观部件,请在PartAdded方法中设置默认值。
您可以阅读Component Lifecycle。
答案 2 :(得分:0)
您可以使用BindingUtils.bindSetter()
检测numberData
的更改,然后初始化oneled_top
BindingUtils.bindSetter(_setOneLabel_top, this, "numberData");
和setter:
function _setOneLabel_top(disp:NumberDisplay):void
{
/* if(this.oneled_top == null) */
this.oneled_top = new OneDisplay(disp.led_top);
}
但我认为,您使用的是[Bindable]
,您根本不需要它。