Flex / ActionScript3 - 对象属性/变量 null
Posted
技术标签:
【中文标题】Flex / ActionScript3 - 对象属性/变量 null【英文标题】:Flex / ActionScript3 - Object Attribute / Variable null 【发布时间】:2011-06-04 16:33:48 【问题描述】:如果我在 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"
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" alpha="showData.value">
<s:fill>
<s:SolidColor color="#000000"/>
</s:fill>
</s:Rect>
<s:Label text="showData.value" color="#FF0000">
</s:Label>
</s:Group>
【问题讨论】:
【参考方案1】:请记住,您不仅要赋值,还要声明成员变量oneled_top
。此时,您无法访问numberData
,因为它还没有被实例化(没有对new NumberData()
的调用!你必须找到一种方法在以后调用new OneDisplay (numberData.led_top)
,当实际上有一个访问的价值。
【讨论】:
+1 以获得对该问题的可靠解释。就未来可以访问的值而言,我建议使用 commitProperties() (就像我在回答中所做的那样)。【参考方案2】:您提供了很多我不想逆向工程的代码。
答案是 oneled_top 在 numberData 之前被初始化。使用 MXML 时,您无法控制变量的初始化。
在 commitProperties() 方法中设置默认值,或者如果 oneled_Top 应该是皮肤部件,请在 PartAdded 方法中设置默认值。
阅读Component Lifecycle,您会受益匪浅。
【讨论】:
【参考方案3】:可以使用BindingUtils.bindSetter()
检测numberData
的变化,然后初始化oneled_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]
,你不应该需要它。
【讨论】:
以上是关于Flex / ActionScript3 - 对象属性/变量 null的主要内容,如果未能解决你的问题,请参考以下文章
Actionscript 3 和 Flex 4 通过触摸滚动 TileList
有啥方法可以将 ActionScript 3 (Flex/AIR) 项目打印到标准输出?
需要帮助使用 Flex/ActionScript 3 创建平滑的翻转或 FishEye 效果