2010-08-31 1 views
1

это прослеживание вопроса от this one, я не хочу, чтобы продолжать идти в комментариях и мешает людям получать кровную репутацию ... :)Почему ссылка на объект null при попытке ссылки на mx: Canvas из ActionScript?

В моем Кэрнгормсе класса команды, чтобы получить его компилировать мне нужно было сказать ему, что 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() 

как будто subObject не существует. Похоже, что я могу получить новый экземпляр MyCanvas, а не тот экземпляр, который я хочу получить от main.mxml с идентификатором myCanvas. Я прав? Как это исправить?

Редактировать (10:59 pm GMT + 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"); 
     } 
     } 
    } 
} 

В принципе, я хочу, чтобы получить ручку на объекте с ID myCanvas в main.mxml используя myCanvas объект в MyCommand.as

+0

показать код PLZ !!! – Eugene

ответ

1

Что является ли область вашей переменной myCanvas? Он внутри метода где-то? Вам нужно будет сделать его общедоступным или дать ему getter/setter, чтобы иметь доступ к нему.

Возможно, вы также попытаетесь ссылаться на него, прежде чем он будет добавлен к его родительскому объекту, используя метод addChild().

В ваших примерах действительно недостаточно кода для определения проблемы, но эти вещи должны дать вам возможность начать поиск.

+0

Это представление Cairngorm, определенное в MXML, созданное в main.mxml с '', где 'view' сопоставляется с' com.foo.bar.view. * '. –

+0

@ Аарон Б. Рассел: Теперь я смущен. Вы понимаете, что этот комментарий противоречит тому, что у вас есть в вашем вопросе, правильно? Если вы создаете экземпляр myCanvas в ActionScript, как и в своем вопросе, вы бы не создали его в MXML и наоборот. – Robusto

+0

Извините за путаницу, я вернулся и отредактировал оригинальный пост сейчас. –

2

Может быть несколько вещей. Во-первых, вам нужны скобки для имени вашего класса после «нового» оператора: new MyCanvas(); Во-вторых, вы можете попытаться получить доступ к вашему подкомпоненту, прежде чем жизненный цикл компонента будет готов для этого. (Это трудно сказать из кода вас в курсе, так как не хватает контекста.)

+0

Извините за путаницу, я вернулся и отредактировал оригинальный пост сейчас. –

+0

Я не знаком с cairngorm, но не-OO (read lame) способ доступа к нему будет ссылаться на него так: FlexGlobals.topLevelApplication.myCanvas.subObject. Вопрос, который у меня был бы для вас, это тот, кто отправляет мероприятие? При регулярных событиях flex (non-cairngorm) вы можете получить доступ к свойству «target» события, чтобы получить ссылку на отправителя. Если отправителем является myCanvas, вы можете просто получить доступ к объекту следующим образом: (target as MyCanvas) .subObject. Надеюсь, это поможет. –

1

1 способ добавить EventListener когда ваши myCanvas будут готовы после CreationComplete и сделать все свои вещи

и второй is: Определите свой subObject как и в классе myCanvas, чтобы вы могли получить к нему доступ на этапе Init вашего компонента.

С уважением Евгений

P.S. все время каждый хочет получить ответ без хорошо сформированного образца своей проблемы, его страшный !!

+0

Извините за путаницу, я вернулся и отредактировал оригинальный пост. –

+0

, если вы хотите обрабатывать myCanvas в myCommand, как вы связали их? я этого не вижу ??? есть неправильный способ использования: trace (FlexGlobals.topLevelApplication.myCanvas.subObject.toString()); – Eugene