Эквивалент Flex DataBinding с использованием Pure Actionscript - PullRequest
1 голос
/ 14 июня 2010

Когда Flex видит что-то вроде этого:

<mx:Label text="Hello {MyVar} World!"/>

Это должно как-то перевести в ActionScript. Но что, если мне нужно сделать что-то подобное, во время выполнения. Как я могу выполнить то, что динамично? КОГДА Я НЕ ЗНАЮ СОДЕРЖАНИЕ ШАБЛОНА СВЯЗИ.

В ActionScript необходимо, чтобы он выглядел что-то примерно так:

public function CustomDynamicBinding(StringToBind:String):Label {
  // *EXAMPLES* Of StringToBind:
  //    "Hello {MyVar} World!"
  //    "Product: {name} ${price}.00"
  //    "{data.label}, {data.description}"
  // I've Written It This Way Because I DO NOT KNOW The Exact Text To Be Bound At Design Time.
  [Bindable]
    var Lab:Label=new Label();
    Lab.text=???
    return(Lab);
}

Как я могу выполнить этот вид "динамического" связывания ... Где я не знаю значение "StringToBind" до времени выполнения? Для целей этого вопроса мы можем предположить, что я знаю, что любая переменная (и), упомянутая в «StringToBind», гарантированно существует во время выполнения.

Я уже понимаю, что есть гораздо более простые способы выполнить эту задачу СТАТИЧЕСКИ, используя только Flex / MXML. Для моего проекта важно, чтобы я понимал, как это можно сделать без MXML.

Делаем это: lab.text = stringToBind.replace ("{myVar}", str);

НЕ будет работать, потому что это просто присваивает ОДНАКО значение "{myVar}" - (которое может даже не БЫТЬ переменной, на которую ссылается "stringToBind" !!) метке, и не учитывает, когда и если myVar изменения! Разве мне не нужно каким-то образом использовать что-то вроде bindProperty?

Ответы [ 3 ]

3 голосов
/ 14 июня 2010

Использование BindingUtils.bindSetter

var stringToBind:String = "Hello {myVar} World!";
[Bindable]
var myVar:String = 'Flex';
var lab:Label = new Label();
BindingUtils.bindSetter(labelValue, this, "myVar");
function set labelValue(str:String):void
{
  lab.text = "Hello " + str + " World!";
  //or if you want it dynamic
  lab.text = stringToBind.replace("{myVar}", str);
}

Обратите внимание, что это не чистый ActionScript в его строгом смысле, поскольку само связывание данных является концепцией Flex;это всего лишь MXML-синтаксис.Вы по-прежнему используете Flex-привязку для внутреннего использования, но опять же, использование только Label дает, если Flexy

1 голос
/ 14 июня 2010
private function _BindingSource_bindingsSetup():Array
{
    var result:Array = [];

    result[0] = new mx.binding.Binding(this,
        function():String
        {
            var result:* = "Hello " + (MyVar) + " World!";
            return (result == undefined ? null : String(result));
        },
        null,
        "_BindingSource_Label1.text"
        );


    return result;
}

Это только часть сгенерированного кода.Не стесняйтесь добавлять параметр -keep-generated-actionscript в параметры компилятора и читать все сгенерированные ActionScript в bin-debug\generated.

0 голосов
/ 13 марта 2013

Раскрытие: бесстыдная самореклама

Библиотека BindageTools предоставляет интуитивно понятный API-интерфейс для создания привязок в ActionScript.

...