Как реализовать привязку данных в классе ActionScript? - PullRequest
2 голосов
/ 22 декабря 2008

У меня проблема со связыванием значений в моих компонентах ActionScript. Я в основном хочу установить значение переменной в моем компоненте равным значению в модели, и чтобы переменная компонента автоматически обновлялась при обновлении значения модели. Я думаю, что просто не совсем понимаю, как работает привязка данных во Flex - это не проблема при использовании компонентов MXML, но при использовании классов ActionScript связывание не работает.

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

package
{
    public class Type1Lists extends TwoLists
    {
        public function Type1Lists()
        {
            super();

            super.availableEntities = super.composite.availableType1Entities;

            super.selectedEntities = super.composite.selectedType1Entities;
        }
    }
}

package
{
    public class Type2Lists extends TwoLists
    {
        public function Type2Lists()
        {
            super();

            super.availableEntities = super.composite.availableType2Entities;

            super.selectedEntities = super.composite.selectedType2Entities;
        }
    }
}

/* TwoLists.mxml */
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            public var __model:ModelLocator = ModelLocator.getInstance();

            public var composite:Composite = 
                __model.selectedComposite;

            [Bindable]
            public var availableEntities:ArrayCollection;

            [Bindable]
            public var selectedEntities:ArrayCollection;
        ]]>
    </mx:Script>

    <mx:List id="availableEntitiesList" dataProvider="{availableEntities}" />

    <mx:List id="selectedEntitiesList" dataProvider="{selectedEntities}" />
</mx:HBox>

Ответы [ 3 ]

2 голосов
/ 22 декабря 2008

Чтобы использовать привязку по коду, вы должны использовать mx.binding.utils. *

Посмотрите методы BindingUtils.bindProperty и bindSetter.

Кроме того, будьте осторожны с ручным связыванием данных, это может привести к утечкам памяти. Чтобы избежать их, сохраните ChangeWatcher, возвращенный bindProperty и bindSetter, и вызовите метод unwatch наблюдателя, когда он больше не используется (т. Е. В методе дипоза или деструкторе)

1 голос
/ 24 января 2009

Чтобы это исправить, я просто преобразовал классы в компоненты MXML и добавил приватную переменную для моего ModelLocator.

/* Type1Lists.mxml */
<?xml version="1.0" encoding="utf-8"?>
<TwoLists xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns="*" 
    availableEntities="{__model.selectedComposite.availableType1Entities}" 
    selectedEntities="{__model.selectedComposite.selectedType1Entities}">
    <mx:Script>
        <![CDATA[
            import model.ModelLocator;

            [Bindable]
            private var __model:ModelLocator = ModelLocator.getInstance();
    </mx:Script>
</TwoLists>

/* Type2Lists.mxml */
<?xml version="1.0" encoding="utf-8"?>
<TwoLists xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns="*" 
    availableEntities="{__model.selectedComposite.availableType2Entities}" 
    selectedEntities="{__model.selectedComposite.selectedType2Entities}">
    <mx:Script>
        <![CDATA[
            import model.ModelLocator;

            [Bindable]
            private var __model:ModelLocator = ModelLocator.getInstance();
    </mx:Script>
</TwoLists>
1 голос
/ 22 декабря 2008

Вам необходимо добавить тег [Bindable] либо в сам класс (делая все свойства связываемыми), либо в свойства, которые вы хотите использовать в качестве [Bindable]. Отметить свойства или объекты как [Bindable] в вашем MXML недостаточно.

...