Flex: привязка к «привязывающей строке» в стиле MXML в сценарии действия? - PullRequest
1 голос
/ 13 октября 2009

Можно ли указать MXML-esque "строки привязки" в ActionScript?

Например, я хочу иметь возможность сделать что-то вроде:

MXMLBinding(this, "first_item",
            this, "{myArrayCollection.getItemAt(0)");
MXMLBinding(this, ["nameLbl", "text"],
            this, "Name: {somePerson.first} {somePerson.last}");

Редактировать: спасибо за ответы и предложения ... По сути, кажется, что вы не можете сделать это. Я покопался и понял, почему.

Ответы [ 6 ]

2 голосов
/ 08 июня 2011

(бесстыдная вилка)

BindageTools может сделать это:

Bind.fromProperty(this, "myArrayCollection", itemAt(0))
    .toProperty(this, "first_item");

Bind.fromAll(
    Bind.fromProperty(this, "somePerson.first"),
    Bind.fromProperty(this, "somePerson.last")
    )
    .format("Name: {0} {1}")
    .toProperty(this, "nameLbl.text");

Обратите внимание, что BindageTools ставит исходный объект первым, а место назначения последним (тогда как BindingUtils ставит место назначения первым и источник последним).

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

Хорошо, я немного покопался, и вот что случилось.

Привязки в MXML, вопреки причине, устанавливаются кодом Java (modules/compiler/src/java/flex2/compiler/as3/binding/DataBindingFirstPassEvaluator.java, если я не ошибаюсь) во время компиляции.

Например, привязка: first_item="{myArrayCollection.getItemAt(0)} "` расширена, в частности, до:

    // writeWatcher id=0 shouldWriteSelf=true class=flex2.compiler.as3.binding.PropertyWatcher shouldWriteChildren=true
    watchers[0] = new mx.binding.PropertyWatcher("foo",
                                                 { propertyChange: true }, // writeWatcherListeners id=0 size=1
                                                 [ bindings[0] ],
                                                 propertyGetter);

    // writeWatcher id=1 shouldWriteSelf=true class=flex2.compiler.as3.binding.FunctionReturnWatcher shouldWriteChildren=true
    watchers[1] = new mx.binding.FunctionReturnWatcher("getItemAt",
                                                       target,
                                                       function():Array { return [ 0 ]; },
                                                       { collectionChange: true }, 
                                                       [bindings[0]],
                                                       null);

    // writeWatcherBottom id=0 shouldWriteSelf=true class=flex2.compiler.as3.binding.PropertyWatcher
    watchers[0].updateParent(target);

    // writeWatcherBottom id=1 shouldWriteSelf=true class=flex2.compiler.as3.binding.FunctionReturnWatcher
    // writeEvaluationWatcherPart 1 0 parentWatcher
    watchers[1].parentWatcher = watchers[0];
    watchers[0].addChild(watchers[1]);

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

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

Никогда не отвечайте никому, кто хочет услышать, а просто управляйте этим с помощью методов получения / установки в ActionScript. С надлежащим MVC очень просто вручную установить поля отображения.

public function set myArrayCollection(value:Array):void {
  myAC = new ArrayCollection(value);
  first_item = mcAC.getItemAt(0);  // or value[0];
}

и т.д ....

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

Принимает ли первый параметр (функция) метода BindingUtils.bindSetter анонимные методы?

BindingUtils.bindSetter(function()
  {
    this.nameLbl.text = "Name: " + somePerson.first + " " + somePerson.last;
  }, this, ["somePerson", "last"]);

Я ненавижу анонимные методы, и, очевидно, это еще более уродливо - поэтому я не буду рекомендовать это, даже если это работает, но просто интересно, если это работает.

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

Использование ChangeWatcher (например, через BindingUtils.bindProperty или .bindSetter) - это путь, да. Я признаю, что это странная запись, но как только вы к ней привыкнете, она имеет смысл, работает отлично и тоже достаточно гибка.

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

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

Я мог бы использовать BindingUtils или ChainWatcher, но тогда я бы закончил с кодом, который выглядит примерно так:

…
    BindingUtils.bindSetter(updateName, this, ["somePerson", "first"]);
    BindingUtils.bindSetter(updateName, this, ["somePerson", "last"]);
…
protected function updateName(...ignored):void {
    this.nameLbl.text = "Name: " + somePerson.first + " " + somePerson.last;
}

Что немного уродливо ... И первый пример, связанный с arrayCollection.getItemAt(0), еще хуже.

...