2010-08-31 39 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

相關問題