Проблемы с доступом к FlashVars через параметры в AS3

Я продолжаю получать ошибки компилятора, когда пытаюсь получить доступ к flashVars в классе AS3.

Вот урезанная версия кода:

package myPackage {
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.display.Sprite;
  public class myClass {
    public function CTrafficHandler() {
        var myVar:String = LoaderInfo(this.root.loaderInfo).parameters.myFvar;}}}

И я получаю ошибку компиляции:

1119: Доступ к возможно неопределенному корню свойства через ссылку с источником статического типа: myClass.

Когда я меняю строку класса на

public class myClass extends Sprite {

Я не получаю сообщение об ошибке компилятора, но получаю это в окне вывода:

TypeError: ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на нулевой объект.

Через отладчик (как предлагается) я вижу, что this.root имеет значение null.

Как я могу решить эту проблему?

[UX] Категории и настройки внешнего вида Flash-сообщений
[UX] Категории и настройки внешнего вида Flash-сообщений
Flash-сообщение - это обычный веб-элемент, используемый для отправки короткого сообщения пользователю. Например, на странице входа в систему может...
0
0
12 474
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я думаю, вам следует расширить Sprite, но сначала обязательно инициализируйте его и, возможно, примените к сцене. Попробуйте включить отладку и посмотрите, что именно является нулевым, как говорится в отчете об исключении.

Ответ принят как подходящий

Я нашел, в чем проблема. Рассматриваемый класс не был основным классом, используемым в проекте, а скорее второстепенным.

Я переместил код в основной класс, чтобы получить параметры, и после того, как я их получил, я отправил их в функцию конструктора класса.

В качестве альтернативы вы можете попробовать использовать объект mx.core.Application.application.parameters.

На странице LiveDocs для mx.core.Application:

application : Object
[static] [read-only] A reference to the top-level application.

parameters : Object
[read-only] The parameters property returns an Object containing name-value pairs representing the parameters provided to this Application.

There are two sources of parameters: the query string of the Application's URL, and the value of the FlashVars HTML parameter (this affects only the main Application).

Обратите внимание: поскольку класс Application является частью пакетов mx, *, это работает, только если вы используете Flex.

hasseg 21.09.2008 23:20

Правильно, я должен был упомянуть об этом. Спасибо что подметил это. :)

David Crow 22.09.2008 00:17

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

Я часто использую flashvars для переменных, которые часто используются на протяжении всего проекта. Такие переменные, как страна и язык. Я считаю, что в этом случае лучше всего уловить эти параметры в классе документа и создать общедоступные переменные с указанными параметрами в качестве значений. Это даст доступ к этим переменным в стиле _global. При этом вам действительно следует экономно использовать глобальные переменные, особенно при работе над совместными проектами.

Ваша проблема в том, что ваш DisplayObject не был добавлен в DisplayList в момент, когда вы пытаетесь получить доступ к флэш-варам. Следовательно, в соответствии с вашим объектом корневой экранный объект имеет значение NULL.

Вы можете убедиться, что ваш DisplayObject находится на сцене, используя следующее:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class MySprite extends Sprite
    {
        // constructor
        public function MySprite()
        {
            super();
            addEventListener( Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true );
        }

        private function onAddedToStage( event:Event ):void
        {
            removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );

            var paramList:Object = LoaderInfo( this.root.loaderInfo ).parameters;
            var myParam:String = paramList["myParam"];
        }
    }
}

`

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