Почему моя ссылка на объект имеет нулевое значение при попытке сослаться на mx:Canvas из ActionScript?

StackOverflow https://stackoverflow.com/questions/3612553

Вопрос

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

В моем командном классе 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.Я прав?Как это исправить?

Редактировать (22:59 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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

привет Евгений

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top