Дублирующая сложная привязка MXML в ActionScript - PullRequest
4 голосов
/ 19 сентября 2008

MXML позволяет вам сделать действительно очень мощное связывание данных, например:

<mx:Button id="myBtn" label="Buy an {itemName}" visible="{itemName!=null}"/>

Я обнаружил, что класс BindingUtils может привязывать значения к простым свойствам, но ни одна из приведенных выше привязок не делает этого. Можно ли сделать то же самое в коде AS3, или Flex беззвучно генерирует много строк кода из моего MXML? Может ли кто-нибудь повторить вышесказанное в чистом AS3, начиная с:

var myBtn:Button = new Button();
myBtn.id="myBtn";
???

Ответы [ 3 ]

2 голосов
/ 19 сентября 2008

Способ сделать это - использовать bindSetter. Это также происходит за кулисами, когда MXML в вашем примере преобразуется в ActionScript перед компиляцией.

// assuming the itemName property is defined on this:
BindingUtils.bindSetter(itemNameChanged, this, ["itemName"]);

// ...

private function itemNameChanged( newValue : String ) : void {
  myBtn.label   = newValue;
  myBtn.visible = newValue != null;
}

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

2 голосов
/ 19 сентября 2008

Вы также можете просмотреть автоматически сгенерированный код, который создает flex при компиляции вашего mxml-файла, добавив аргумент -keep в настройки вашего компилятора. Вы можете найти свои настройки, выбрав свойства своих проектов и выбрав опцию «Компилятор Flex», затем в разделе «Дополнительные аргументы компилятора» добавьте «-keep» к тому, что уже есть.

После этого Flex создаст «сгенерированный» каталог в вашей исходной папке, и внутри вы найдете все временные файлы, которые использовались во время компиляции.

0 голосов
/ 19 сентября 2008

Я полагаю, что flex генерирует небольшую анонимную функцию для решения этой проблемы.

Вы можете сделать подобное, используя ChangeWatcher. Вы могли бы даже сделать новую анонимную функцию в вызове changewatcher.

...