Одиночный класс ArrayCollection в Flashbuilder (Mobile) пуст? - PullRequest
1 голос
/ 30 августа 2011

В настоящее время я пытаюсь реализовать класс Singleton для хранения ArrayCollection элементов, к которым я затем могу обращаться и управлять ими на протяжении жизненного цикла моего приложения.Я создал приведенный ниже класс Singleton, предназначенный для хранения информации 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;
        }
    }
}

Затем я создал следующий код на странице Main 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 заполняется, поскольку оператор трассировки, который я ввел в цикл, четко показывает сборку данных в 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) по какой-то причине кажется пустым.Я включил оператор трассировки, который также говорит, что длина ArrayCollection равна «0».Может кто-нибудь, пожалуйста, помогите ??

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

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

0 голосов
/ 30 августа 2011

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

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

    return instance;
}

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

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

использовать напрямую как

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

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

...