如何在ActionScript类中实现数据绑定?

时间:2008-12-22 15:24:45

标签: flex data-binding actionscript mxml cairngorm

我在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 个答案:

答案 0 :(得分:2)

要使用代码绑定,您应该使用mx.binding.utils。*

看一下BindingUtils.bindProperty和bindSetter方法。

另外,小心手动数据绑定,可能会导致内存泄漏。 要避免它们,请保存bindProperty和bindSetter返回的ChangeWatcher,并在不再使用时调用watcher的unwatch方法(即,在dipose或析构函数方法中)

答案 1 :(得分:1)

您需要将[Bindable]标记添加到类本身(使所有属性都可绑定)或您想要的属性[Bindable]。在MXML中将属性或对象标记为[Bindable]是不够的。

答案 2 :(得分:1)

为了解决这个问题,我只是将类转换为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>