Одиночный класс ArrayCollection в Flashbuilder (Mobile) пуст?

1

В настоящее время я пытаюсь внедрить Singleton Class, чтобы хранить ArrayCollection элементов, которые я могу получить и манипулировать на протяжении всего жизненного цикла моего приложения. Я создал ниже Singleton Class, который предназначен для хранения информации ArrayCollection:

package valueObjects
{
    import mx.collections.ArrayCollection;  

    [Bindable]
    public class Model
    {
        private static var instance:Model = new Model();

        public var ids:ArrayCollection = new ArrayCollection();

        public function Model()
        {
            if(instance)
            {
                trace("New instance cannot be created. Use Singleton.getInstance()");
            }
        }

        public static function getInstance():Model
        {
            return instance;
        }
    }
}

Затем я создал следующий код на главной странице Deafult для моего приложения, чтобы ArrayCollection был заполнен сразу после запуска приложения:

        import valueObjects.Model;          

        protected var models:Model = new Model();

                private function loop():void
        {
            var index:int;
            for( index = 0; index < compsCollection.length; index++ )
            {
                trace( "Element " + index + " is " +  compsCollection[index].comp_id );
                            models.ids.addItem(compsCollection[index].comp_id);
                trace(models.ids.length);
            }               
        }

ArrayCollection в Singleton Class заполняется, поскольку оператор trace, который я ввел в цикл, четко показывает сборку данных в ArrayCollection. Однако тогда, когда я перехожу к другому представлению в приложении, я пытаюсь получить доступ к этому массиву ArrayCollection в классе Singleton со следующим кодом:

import valueObjects.Model;

protected var models:Model = Model.getInstance();
protected var test:ArrayCollection = new ArrayCollection();

protected function view1_viewActivateHandler(event:ViewNavigatorEvent):void
            {

                var index:int;
                trace("Array Length =" + models.ids.length);
                for( index = 0; index < models.ids.length; index++ )
                {
                    trace( "Element " + index + " is " + models.ids[index].comp_id );
                    test.addItem(models.ids[index].comp_id);
                }   
                testbox.text = test.toString(); 
            }

Теперь проблема заключается в том, что когда я пытаюсь получить доступ к этому массиву ArrayCollection (ids), по какой-то причине он кажется пустым. Я включил инструкцию trace, которая также говорит, что длина ArrayCollection равна "0". Может ли кто-нибудь помочь?

Теги:
singleton
flex
flash-builder

2 ответа

0
Лучший ответ

попробуй вот так

public static function getInstance():Model
{
    if(instance == null)
      instance= new Model();

    return instance;
}

здесь нет необходимости присваивать переменной

protected var models:Model = Model.getInstance();

использовать

Model.getInstance().ids = new ArrayCollection();

Попробуйте это, это может быть полезно для u.

  • 0
    Спасибо за быстрый ответ, я изменил класс Singleton (getInstance) на то, что вы предложили в первом фрагменте кода, а остальное оставил без изменений, затем я удалил присвоение переменной из представления, которое используется для доступа к ArrayCollection. и, наконец, я изменил все параметры доступа к ArrayCollection так, как вы сказали «Model.getInstance (). ids.length». После того, как я проверил это, я все еще получаю длину ArrayCollection, возвращающую 0 по какой-то причине. Это действительно раздражает, вы можете помочь дальше?
  • 0
    Я также рассмотрел использование FlexGlobals, однако я не мог заставить их правильно смотреть на ArrayCollection в моем главном представлении по умолчанию, так как он говорил, что он не установлен или не инициирован, я был бы очень признателен за помощь в решении этой проблемы, так как мне действительно нужен доступ к глобальной переменные в моем приложении. Спасибо
Показать ещё 4 комментария
0

В своем основном классе измените новую модель() на Model.getInstance(). Тем не менее, вы все еще находитесь на начальных этапах своего проекта, и у вас есть возможность избежать проблем, которые могут возникнуть у вас в Синглтонах. Http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/, Я бы посоветовал вам использовать Dependency Injection (прямое, просто используя свойство данных или более абстрактно, используя платформу Injection Dependency, такую как Robotlegs, Swiz, Mate или Parsley).

  • 0
    Вы предлагаете мне использовать диспетчер персистентности для хранения ArrayCollection в моем проекте?
  • 0
    Я говорю, что один из способов сделать это - поместить ссылку на ваш AC во второй аргумент pushView. Или вы можете использовать Framework, который следит за тем, чтобы новый View был добавлен в список отображения, и дает ему то, что ему нужно. Или вы можете создать что-то, похожее на фреймворк, прослушивая ADDED_TO_STAGE, перехватывая новый экземпляр и предоставляя ему необходимую информацию. Есть множество вещей, которые вы можете сделать, которые не приведут вас к путанице в болоте, которую вы пригласите с помощью Singletons.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню