Почему моя ссылка на объект равна нулю при попытке ссылки на mx: Canvas из ActionScript? - PullRequest
1 голос
/ 31 августа 2010

это следующий вопрос от этого , я не хочу продолжать в комментариях и мешать людям получить с трудом заработанную репутацию ...:)

В моем классе команд 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 с идентификатором 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");
      }
        }
    }
}

По сути, я хочу получить дескриптор объекта с идентификатором myCanvas в main.mxml используя myCanvas объект в MyCommand.as

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

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

1 голос
/ 01 сентября 2010

1 способ - добавить eventListener, когда ваш myCanvas будет готов после CreationComplete, и выполнить все ваши действия

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

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

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

1 голос
/ 31 августа 2010

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

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

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

...