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