2010-08-31 16 views
1

这是从this one一个跟进的问题,我不想保持在评论中去,并阻止人们获得来之不易的声誉... :)为什么我的对象在试图从ActionScript引用mx:Canvas时引用null?

在我的凯恩戈姆命令类,得到它编译我需要告诉它是什么myCanvas,所以我用这条线:

var myCanvas : MyCanvas = new MyCanvas; 

我猜这是错误的,但是,因为虽然它编译,如果我尝试做这样的事情:

if (myCanvas.subObject.value == 0) { ... } 

它会扔th是错误:

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。我对吗?我该如何解决?

编辑(格林尼治标准时间下午10:59 + 1):好吧,所以看起来我在这里一直过于模糊。这里是我的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"); 
     } 
     } 
    } 
} 

基本上,我想用myCanvas对象来获得ID myCanvas对象上的手柄main.mxmlMyCommand.as

+0

显示代码plz !!! – Eugene 2010-08-31 20:51:06

回答

1

什么是你的myCanvas变量的范围?它在某个方法里面吗?您需要将其公开化,或者让getter/setter能够访问它。

在使用addChild()方法将其添加到其父项之前,您可能也会尝试引用它。

在你的例子中确实没有足够的代码来确定问题,但这些东西应该给你开始寻找的地方。

+0

它是一个在MXML中定义的Cairngorm视图,在main.mxml中用''实例化,其中'view'映射到'com.foo.bar.view。*'。 – 2010-08-31 19:51:17

+0

@Aaron B. Russell:现在我很困惑。你确实意识到这个评论与你在问题中的含义相矛盾,对吧?如果您在ActionScript中创建myCanvas实例,就像在您的问题中一样,您不会在MXML中创建它,反之亦然。 – Robusto 2010-08-31 20:05:27

+0

对不起,我已经回去编辑原文。 – 2010-08-31 22:00:07

2

可能是一些事情。首先,在“new”语句之后,需要在类名称中使用括号:new MyCanvas();其次,您可能在组件生命周期准备好之前尝试访问子组件。 (这是很难从您发布的代码告诉,因为没有足够的背景。)

+0

对不起,我已经回去编辑原来的帖子了。 – 2010-08-31 22:00:37

+0

我对cairngorm并不熟悉,但访问它的非OO(read lame)方法是像这样引用它:FlexGlobals.topLevelApplication.myCanvas.subObject。我想给你的问题是谁在发送活动?通过定期flex(非cairngorm)事件,您可以访问事件的“目标”属性以获取发件人的引用。如果发件人是myCanvas,则可以像这样访问对象:(target as MyCanvas).subObject。希望有所帮助。 – 2010-08-31 23:29:22

1

1的方法是添加事件监听,当你myCanvas将CreationComplete后准备和做所有的东西

和第二是: 在myCanvas类中定义您的子对象,以便您可以在组件的Init Stage上访问它。

问候 尤金

附:所有的时间,每个人都想得到答案,没有形成良好的问题样本,它的可怕!

+0

对不起,我已经回去编辑原文。 – 2010-08-31 22:01:26

+0

如果你想在myCommand中处理myCanvas,你是如何连接它们的?我看不到它? 有一个不好的方法使用试试这个: trace(FlexGlobals.topLevelApplication.myCanvas.subObject.toString()); – Eugene 2010-08-31 22:10:29

相关问题