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

Posted

技术标签:

【中文标题】如何在 ActionScript 类中实现数据绑定?【英文标题】:How do I implement data binding in an ActionScript Class? 【发布时间】:2010-09-28 00:59:48 【问题描述】:

我的 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>

【问题讨论】:

【参考方案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>

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

看看 BindingUtils.bindProperty 和 bindSetter 方法。

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

【讨论】:

以上是关于如何在 ActionScript 类中实现数据绑定?的主要内容,如果未能解决你的问题,请参考以下文章

如何在原生微信小程序中实现数据双向绑定

如何在 SwiftUI 的视图控制器中实现数据绑定?

如何使用 Kotlin 在 RecyclerView Adapter 中实现 onClick 并进行数据绑定

在react中实现一个简单双向数据绑定

如何在 Python 和 Qt Quick QML 应用程序中实现简化的双向数据绑定

如何在batmanjs中实现导航菜单