Flex привязка данных функция - PullRequest
1 голос
/ 19 февраля 2009

Кто-нибудь знает, как программно связать свойство с функцией, которая не является геттером? IE: у меня есть функция, которая возвращает переведенную строку на основе идентификатора, который вы ей передали. Как мне сделать это в AS3, а не MXML? (причина в том, что у меня есть динамический макет, который я отображаю на основе XML, и поэтому мне пришлось создавать и добавлять всех потомков программно).

Ответы [ 6 ]

2 голосов
/ 22 апреля 2009

Если вы хотите связать результат функции, вам нужно будет указать тип события, которое будет инициировано при изменении результата функции (см. Пункт 2).

private var foo:int;

[Bindable(event="myCustomFunctionBinding")]
public function myFunction():String
{
    return "This is foo :" + foo;
}

Затем, когда вы хотите, чтобы все элементы обновили связанное значение, вы должны отправить событие самостоятельно:

private function bar():void
{
    foo++;
    dispatchEvent(new Event("myCustomFunctionBinding"));
}

В этом случае вы можете связать это так:

<mx:TextArea text="{myClass.myFunction()}" />
1 голос
/ 26 февраля 2009

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

public function loadStringBinding(aIdentifier:String, aField:UIComponent, aProperty:String, aAddtlChars:String = null):Function 
{
    return function():void {
        var str:String;
        if(aAddtlChars)
        {
            str = aAddtlChars;
        }
        else
        {
            str = '';
        }
    if(_localePacks.get(currentLocale))
    {
        if(XML(_localePacks.get(currentLocale)).translatedString.(@identifier==aIdentifier).@translation.toString().length > 0)
        {
            aField[aProperty] =  XML(_localePacks.get(currentLocale)).translatedString.(@identifier==aIdentifier).@translation + str;
            return;
        }
        else
        {
            aField[aProperty] =  aIdentifier + str;
            return;
        }
    }
    else
    {
        //TODO: Replace with webservice call to get individual string
    }

    aField[aProperty] =  'No locale pack' + str; 
    return;
    }
}

Что это делает, так это возвращает функцию, с которой она связана, так что я могу передать ее любому компоненту, с которым я хочу, чтобы свойство связывалось. Это реализовано как:

_currentWatchers.addItem(BindingUtils.bindSetter(LocaleManager.instance().loadStringBinding('firstName, myCFormItem, 'label', '*'), LocaleManager.instance(), 'newLocale'));

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

1 голос
/ 20 февраля 2009

Я не уверен, что это то, что вы ищете, но я сделал нечто подобное:

Скажем, вы объявили метку, используя вашу функцию:

<mx:Label text="{LocaleUtil.getMessage('label.description')}"/>

Эта функция getMessage считывает файл XML в зависимости от выбранного языкового стандарта.

Если пользователь меняет локаль, вы должны вызвать executeChildBindings(true) для любого контейнера или для всего приложения:

this.parentApplication.executeChildBindings(true);

Это заставит каждого ребенка UIComponent снова выполнить привязки.

1 голос
/ 20 февраля 2009

Вы можете вызвать функцию установки с помощью BindingUtils.bindSetter(). Вы можете использовать это, чтобы вызвать функцию установки, которая вызывает вашу функцию перевода и устанавливает возвращаемое значение в указанное место. К сожалению, вы не можете динамически указывать хост сеттера, как вы можете с помощью BindingUtils.bindProperty().

0 голосов
/ 21 февраля 2009

Так как функции являются объектами в actionscript3.0, вы можете добавить к ним свойства, так же, как и любой другой объект,

var f : Function = function() : void{ 
   trace("Value of testProp: " + arguments.callee.testProp ); 
};
(f as Object).testProp = 'TESTING';
f();

arguments.callee используется как ключевое слово this . arguments.callee содержит ссылку на функцию, внутри которой она используется.

Я не уверен, что это то, что вы хотели, но именно так вы бы добавили свойство к функции.

Извините, мне кажется, я получил это задом наперед, вы хотите добавить функцию к свойству, а не добавить свойство к функции. О, надеюсь, вам все равно понравится этот пост.

0 голосов
/ 19 февраля 2009

Вы можете привязать функции к любому событию, которое отправляется при изменении свойства. используйте метод члена addEventListener (), чтобы добавить обработчик. Прочитайте документацию по Flex 3.0 здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...