Реагировать на изменение статического свойства - PullRequest
0 голосов
/ 02 июня 2009

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

instanceProperty={callInstanceFunction(ItemRenderer.staticProperty)}

Каким будет эквивалентный способ настройки этого в AS (я полагаю, с помощью BindingUtils)?

UPDATE:
Поэтому я подумал, что следующее не сработало, но похоже, что Flex подавляет ошибки, возникающие в instanceFunction, создавая впечатление, будто сама привязка плохая.

BindingUtils.bindSetter(instanceFunction, ItemRenderer, "staticProperty");

Однако, когда вызывается instanceFunction, все уже инициализированные переменные в данном экземпляре имеют значение null, что и стало причиной ошибок, упомянутых выше. Есть идеи, почему это так?

Ответы [ 5 ]

2 голосов
/ 07 марта 2012

У вас есть 2 варианта, которые мне известны:

Вариант 1 Вы можете изучить код, который компилирует гибкий компилятор на основе вашего MXML, чтобы увидеть, как он обрабатывает привязку к статическим свойствам. Существует директива компилятора, называемая -keep-generate-actionscript, которая заставит сгенерированные файлы задерживаться. Рассматривая их, вы сможете понять, что происходит. Эта опция будет включать создание экземпляров объектов Binding и объектов StaticPropertyWatcher.

Вариант 2 Существует объект staticEventDispatcher, который добавляется во время сборки к классам, содержащим статические переменные. См. Этот пост http://thecomcor.blogspot.com/2008/07/adobe-flex-undocumented-buildin.html. Согласно посту, этот объект добавляется только на основе наличия статических переменных, а не функций-получателей.

Пример варианта 2 Скажем, у нас есть класс с именем MyClassConistingStaticVariable со статической переменной с именем MyStaticVariable и другой переменной someobject.somearrayproperty, которую мы хотим обновлять при каждом изменении MyStaticVariable.

Class(MyClassContainingStaticVariable).staticEventDispatcher.addEventListener(
PropertyChangeEvent.PROPERTY_CHANGE,
function(event:PropertyChangeEvent):void
{
    if(event.property == "MyStaticVariable")
    {
        someobject.somearrayproperty = event.newValue as Array;
    }
});
0 голосов
/ 14 марта 2010

Вы можете создать класс HostProxy, который будет заменять вызов funciton. Вроде как класс HostFunctionProxy, который простирается от прокси и имеет getProperty("functionInvokeStringWithParameters"), который будет вызывать функцию удаленно с хоста и отправлять событие «change», чтобы инициировать привязку в типичном [Bindable("change")] прокси-классе.

Затем вы позволяете классу HostProxy выступать в качестве хоста и используете свойство для удаленного запуска вызова функции. Конечно, было бы круче иметь TypeHelperUtil, чтобы позволить преобразовывать необработанные строковые значения в значения сериализованного типа во время выполнения для параметров метода (обычно разделенных запятыми).

Пример: например.

 var standInHost:Object = new HostFunctionProxy(someModelClassWithMethod, "theMethodToCall(20,11)");
// With BindingUtils.....
// bind host: standInHost
// bind property: "theMethodToCall(20,11)"

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

0 голосов
/ 02 июня 2009

Если вы собираетесь это сделать, используйте синглтон вместо статического. Я не думаю, что это будет работать на статике. (Если вам нужно сделать это таким образом, возможно, есть пара способов, чтобы вы могли пересмотреть это, и это было бы лучше).

var instance:ItemRenderer = ItemRenderer.getInstance();
BindingUtils.bindProperty(this, "myProperty", instance, "theirProperty"); 
0 голосов
/ 12 августа 2009

Поработав некоторое время, я пришел к выводу, что в настоящее время это невозможно в ActionScript, даже с bindSetter. Кажется, существуют некоторые функции привязки данных, предназначенные только для MXML, судя по следующему отрывку из документации Adobe (хотя в любом случае все это не скомпилировано в код AS)?

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

Источник: http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_7.html

0 голосов
/ 02 июня 2009

Я думаю, вам нужно ответить на событие PropertyChanged.

...