1

这是这个问题的后续问题,我不想继续发表评论并阻止人们获得来之不易的声誉...... :)

在我的 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");
      }
        }
    }
}

myCanvas基本上,我想在main.mxml使用myCanvas对象中获取具有 ID 的对象的句柄MyCommand.as

4

3 回答 3

2

可能是几件事。首先,您需要在“new”语句之后的类名上加上括号:new MyCanvas();其次,您可能试图在组件生命周期准备好之前访问您的子组件。(由于没有足够的上下文,很难从您发布的代码中分辨出来。)

于 2010-08-31T19:48:40.710 回答
1

您的 myCanvas 变量的范围是什么?它在某处的方法中吗?您需要将其公开或提供 getter/setter 才能访问它。

您可能还尝试使用 addChild() 方法在将其添加到其父级之前对其进行引用。

您的示例中确实没有足够的代码来确定问题,但是这些东西应该可以让您从某个地方开始寻找。

于 2010-08-31T19:46:04.037 回答
1

一种方法是在您的 myCanvas 在 CreationComplete 之后准备好时添加 eventListener 并完成所有工作

第二个是:在 myCanvas 类中定义您的subObject,这样您就可以在组件的 Init Stage 上访问它。

关于尤金

ps 一直以来,每个人都想在没有格式良好的问题样本的情况下得到答案,这太可怕了!!

于 2010-08-31T20:53:16.010 回答