Доступ к объектам, созданным в файле MXML приложения Flex в других классах AS - PullRequest
0 голосов
/ 29 июля 2011

У меня есть объект, объявленный и созданный в единственном файле MXML моего приложения Flex:

public var CDN:CDNClass = new CDNClass;

Я хотел бы получить доступ к этому же объекту CDN (и его открытым методам и свойствам) в другом объявленном классев отдельном файле .as как таковой:

package my.vp
{
    import my.media.CDNClass;

    public class SyncConnectorManager
    {

        private function syncMessageReceived(p_evt:SyncSwfEvent):void
        {
            switch (p_evt.data.msgNm)
            {
                case "startStream" :
                    // Play a stream
                    CDN.parsePlayList(p_evt.data.msgVal);
                    break;

Но когда я пытаюсь получить доступ к общедоступному методу parsePlayList в объекте CDN в методе в классе, определенном в файле .as, я получаю следующую ошибку:

Доступ к неопределенному свойству CDN

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

Спасибо - любая помощь очень ценится.Возможно, мои мысли о OOD / OOP здесь не верны?

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

ЭТО зависит от архитектуры вашего класса.Чтобы ваш код работал, экземпляр CDNClass должен быть определен и реализован внутри вашего SyncConnectorManager.

Как правило, вы всегда можете вызывать компоненты, но никогда не должны вызывать

Oneопция - передать экземпляр CDNClass в переменную внутри SyncConnectorManager.Добавьте эту переменную в ваш класс SyncConnectionManager:

public var CDN:CDNClass = new CDNClass;

И в какой-то момент сделайте это:

syncConnectorManagerInstance.CDN = CDN;

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

1 голос
/ 29 июля 2011

Да, ваше мышление ООП здесь не правильно. Вы должны иметь в виду различия между классами и экземплярами. Эта строка объявляет поле в текущем классе и инициирует его с экземпляром:

public var CDN:CDNClass = new CDNClass;

Таким образом, текущий экземпляр вашего класса MXML (вы можете думать об этом как о обычном классе AS с некоторыми другими обозначениями) имеет открытое поле. Для работы с CDN экземпляром вам нужно что-то из следующего:

  • Считайте значение CDN (насколько оно общедоступно) из экземпляра вашего класса MXML . Для этого вам нужна ссылка.
  • Экземпляр вашего класса MXML может иметь ссылку на экземпляр SyncConnectorManager, а SyncConnectorManager должен иметь способ ввести туда значение CDN. Что-то вроде:

Ваш класс:

package my.vp
{
    import my.media.CDNClass;

    public class SyncConnectorManager
    {
        private var CDN:CDNClass;

        public function SyncConnectorManager(CDN:CDNClass)
        {
             this.CDN = CDN;
        }

        private function syncMessageReceived(p_evt:SyncSwfEvent):void
        {
            switch (p_evt.data.msgNm)
            {
                case "startStream" :
                    // Play a stream
                    CDN.parsePlayList(p_evt.data.msgVal);
                    break;

В вашем случае SyncConnectorManager класс не объявлен CDN (проблема упомянутой вами ошибки компилятора) и не создан (проблема NPE, даже если вы просто объявляете поле).

В качестве нижнего я могу предложить вам следовать Соглашения об именовании и кодировании ActionScript , чтобы рассказать другим людям и членам команды о вашем коде:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...