当尝试从 ActionScript 引用 mx:Canvas 时,为什么我的对象引用为 null?
-
26-09-2019 - |
题
这是来自的后续问题 这个, ,我不想继续在评论中阻止人们获得来之不易的声誉......:)
在我的 Cairngorm 命令类中,为了让它编译,我需要告诉它 myCanvas 是什么,所以我使用了这一行:
var myCanvas : MyCanvas = new MyCanvas;
不过,我猜这是错误的,因为虽然它可以编译,但如果我尝试做这样的事情:
if (myCanvas.subObject.value == 0) { ... }
它会抛出这个错误:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at com.foo.bar.command::MyCommand/execute()
就好像子对象不存在一样。看起来我可能会得到一个新的 MyCanvas 实例,而不是我想要从 main.mxml 中获取 id 为 myCanvas 的实例。我对吗?我该如何解决?
编辑(格林尼治标准时间+1 晚上 10:59): 好吧,看来我在这里太含糊了。这是我的 main.mxml
:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:control="com.foo.bar.control.*"
xmlns:business="com.foo.bar.business.*"
xmlns:view="com.foo.bar.view.*"
applicationComplete="com.foo.bar.util.StartupUtil.init()"
horizontalScrollPolicy="off"
verticalScrollPolicy="off"
borderThickness="0"
paddingBottom="0"
paddingLeft="0"
paddingTop="0"
paddingRight="0"
>
<mx:Script>
<![CDATA[
import com.foo.bar.model.PlayerModelLocator;
[Bindable]
private var model : PlayerModelLocator = PlayerModelLocator.getInstance();
]]>
</mx:Script>
<!-- ========================================================================== -->
<!-- the ServiceLocator where we specify the remote services -->
<business:Services id="services" />
<!-- the FrontController, containing Commands specific to this application -->
<control:PlayerController id="controller" />
<!-- ========================================================================== -->
<mx:Style source="assets/main.css" />
<view:MyCanvas id="myCanvas" />
</mx:Application>
这是我的 com/foo/bar/command/MyCommand.as
:
package com.foo.bar.command {
/* add to controller
addCommand( MyEvent.EVENT_CHANGE_VOLUME, ChangeVolumeCommand );
*/
import flash.net.SharedObject;
import com.adobe.cairngorm.control.CairngormEvent;
import com.adobe.cairngorm.commands.ICommand;
import com.foo.bar.model.PlayerModelLocator;
import com.foo.bar.event.MyEvent;
import com.foo.bar.view.*;
public class ChangeVolumeCommand implements ICommand {
public function execute(event:CairngormEvent):void {
var model : PlayerModelLocator = PlayerModelLocator.getInstance();
var myEvent : MyEvent = MyEvent(event);
var myCanvas : MyCanvas = new MyCanvas();
var so:SharedObject = SharedObject.getLocal("fixie.video");
if (myCanvas.subObject.value == 0) {
trace("subobject value is 0");
}
}
}
}
基本上,我想获取带有 ID 的对象的句柄 myCanvas
在 main.mxml
使用 myCanvas
对象在 MyCommand.as
解决方案
myCanvas 变量的范围是什么?它是在某个方法内部吗?您需要将其公开或为其提供 getter/setter 才能访问它。
您可能还尝试在将其添加到其父级之前使用 addChild() 方法来引用它。
您的示例中确实没有足够的代码来确定问题,但这些内容应该为您提供开始寻找的地方。
其他提示
可能有几件事。首先,您需要在“new”语句后面的类名上加上括号: new MyCanvas();
其次,您可能会在组件生命周期准备好之前尝试访问子组件。(很难从您发布的代码中看出,因为没有足够的上下文。)
一种方法是当您的 myCanvas 在 CreationComplete 后准备就绪时添加 eventListener 并执行所有操作
第二个是:定义你的 子对象 与 myCanvas 类中一样,因此您可以在组件的 Init Stage 上访问它。
关于尤金
附注一直以来,每个人都想在没有良好的问题样本的情况下得到答案,这太糟糕了!