Как убедиться, что текст ActionScript TextInput обновляется при обновлении свойства объекта, определяющего этот текст? - PullRequest
0 голосов
/ 30 сентября 2009

Не простой вопрос для расшифровки, поэтому позвольте мне свести его к минимуму. Я пытаюсь преобразовать компонент MXML в класс ActionScript. Компонент состоит из формы с TextInput, TextArea и двух кнопок - «Сохранить» и «Отмена», валидатора для TextInput и другой логики для обработки происходящих событий. Этот компонент в настоящее время расширен несколькими другими компонентами.

Теперь в компоненте MXML привязка текстового свойства TextInput к свойству в объекте была очень простой:

<mx:TextInput text="{_itemToEdit.name}" />

Но в ActionScript я создаю TextInput и задаю свойство text до того, как объект будет установлен, а TextInput не обновляется:

public var itemToEdit:Object = {};

private var nameInput:TextInput = new TextInput();

public function MyClass()
{
    nameInput.text = itemToEdit.name;
}

Как я могу убедиться, что текстовое свойство TextInput связано с указанным свойством в Объекте?

Ответы [ 4 ]

1 голос
/ 03 октября 2009

Связывание - все о событиях изменения стрельбы. вам нужно изменить ваш класс itemToEdit, чтобы он стал EventDispatcher, чтобы этот хак работал. здесь идет

//item to edit class
private var _name:String;

public function set name(value:String):void
{
    _name = value;
    dispatchEvent(new Event("NAME_CHANGED"));
}


//whatever the binding class is
private var _itemToEdit:ItemToEdit;
private var _textField:TextField;

public function set itemToEdit(value:ItemToEdit):void
{
    if (_itemToEdit) removeEventListeners();
    _itemToEdit = value;
    if (_itemToEdit) addEventListeners();
}


private function addEventListeners():void
{
    _itemToEdit.addEventListener("NAME_CHANGED", itemToEdit_nameChangedHandler);
    itemToEditChangedHandler(null);
}

private function itemToEdit_nameChangedHandler(event:Event):void
{
    _textField.text = _itemToEdit.name;
}

Очевидно, что это было сделано только для скорости, вам понадобятся пользовательские события и некоторые лучшие имена и т. Д., Но это основной jist.

0 голосов
/ 01 октября 2009

Скомпилируйте ваш компонент MXML с опцией -keep. Изучите код ActionScript, сгенерированный mxmlc, и сделайте что-то подобное.

Вы также можете сделать это с помощью объекта Proxy - я написал об этом здесь: http://flexblog.faratasystems.com/?p=433

0 голосов
/ 01 октября 2009

Если "itemToEdit" является чистым объектом AS3, то привязка, вероятно, все равно не будет работать должным образом. То есть он будет работать при первоначальном создании объекта, но любые изменения «имени» в объекте не будут обнаружены. (Я могу ошибаться ... не проводил обширных тестов)

В любом случае, вашу проблему легко решить с помощью геттеров / сеттеров:

private var _itemToEdit:Object;

public function get itemToEdit():Object { return _itemToEdit; }
public function set itemToEdit(value:Objecy):void {
  _itemToEdit = value;
  nameInput.text = value.name;
}

Связывание здесь не обязательно.

0 голосов
/ 30 сентября 2009

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

http://cookbooks.adobe.com/index.cfm?event=showdetails&postId=6802

http://raghuonflex.wordpress.com/2007/08/30/binding-in-mxml-as/

...