Обратитесь к представлению Spark в коде - PullRequest
0 голосов
/ 12 ноября 2011

Я создаю мобильное приложение AIR с помощью Flash Builder 4.5. Исходное представление в моем пакете представлений - TestHomeView.mxml. Я хочу сослаться на это в одном из моих классов .as в другом месте приложения, и я не уверен, как это сделать.

Теоретически я должен иметь возможность добавить атрибут "id" в TestHomeView.mxml, но FB выдает мне ошибку: "id не разрешен в корневом теге компонента". Корневой тег - это s: view.

Причина, по которой мне нужно это сделать, заключается в том, что в другом классе я делаю различные вычисления, а затем мне нужно передать массив значений компоненту в моем классе представления. Поэтому в SomeOtherActionScriptClass.as я сначала собираю массив myArray, а затем в этом классе хочу сделать следующее:

 myViewComponent.viewArray = myArray;

Если я собираюсь это сделать, мне также нужно импортировать класс представления в класс .as, что мне кажется странным. Так есть ли простой способ сделать то, что я хочу, или я должен отправить пользовательское событие, которое содержит массив, и прослушать его в классе представления?

РЕДАКТИРОВАТЬ - Основываясь на предложении MVC ниже, я сделал следующее в модели:

    [Bindable]
public class Model
    {
    private static var myModel:Model;//doesn't let me name it 'model' because
                                     //I have a package named 'model'
    public var myArray:Array;  //its value set later in model code
public function Model()
{
    if ( Model.myModel != null ){
        throw new Error( "Only one Model instance should be instantiated" );
        }
    }

    // singleton: always returns the one existing static instance to itself
    public static function getInstance() : Model {
        if ( myModel == null ){
            myModel = new Model();
        }
        return myModel;
    }

Тогда в коде представления у меня есть:

[Bindable] //do I actually need this?
private var myModel:Model = Model.getInstance();
var viewArray = new Array();
viewArray = myModel.myArray;

Но он возвращается в ноль. Когда я ставлю точку останова в классе Model, она не равна нулю, но когда я пытаюсь получить к ней доступ из класса представления, она становится нулевой. Сама модель не равна нулю, но эта переменная равна.

Что я делаю не так?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2011

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

Добавьте этот класс внизу файла класса Model (вне класса Model):

internal class SingletonEnforcer{} 

Затем создайте конструктор модели следующим образом:

public function Model(enforcer:SingletonEnforcer){ Init(); } // if init code is needed

public static function get Instance():Model
{
    if (!myModel){
        myModel = new Model(new SingletonEnforcer());
    }
    return myModel;
}

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

Я не уверен в вашем первом вопросе о ссылке на основной mxml вашего приложения, но если бы вы спрашивали, как вызвать приложение, которое работает (например, WindowedApplication в AIR), то вы бы назвали его так:

// my WindowedApplication file = MyApp.mxml
MyApp(this.parentApplication)

Это вернет экземпляр приложения.

Как только вы настроите Singleton, как у меня выше, вы сможете получить доступ к вашему массиву, например:

Model.Instance.myArray;

Надеюсь, это поможет!

0 голосов
/ 12 ноября 2011

Следуйте шаблону MVC.
Создайте класс Model (сделайте его Bindable) со свойством viewArray. Привязать к этому свойству из вашего просмотра. А в любом другом классе просто измените viewArray свойство модели. Событие привязки будет запущено, и это свойство также будет изменено в вашем представлении. Чтобы сделать вашу Модель "видимой" из любой точки, вы можете сделать ее Синглтоном.

...