Почему моя ссылка на объект имеет нулевое значение при попытке сослаться на mx:Canvas из ActionScript?
-
26-09-2019 - |
Вопрос
это дополнительный вопрос от Вот этот, я не хочу продолжать писать комментарии и мешать людям зарабатывать кровно заработанную репутацию...:)
В моем командном классе 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, поэтому вы сможете получить к нему доступ на этапе инициализации вашего компонента.
привет Евгений
п.с.все время все хотят получить ответ без четко сформулированного описания своей проблемы, это ужасно !!