如何在 ActionScript 类中实现数据绑定?
-
23-08-2019 - |
题
我在 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
为了解决这个问题,我只需将类转换为 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>
其他提示
要通过代码使用绑定,您应该使用 mx.binding.utils.*
看一下BindingUtils.bindProperty 和bindSetter 方法。
另外,请小心手动数据绑定,它可能会导致内存泄漏。为了避免它们,请保存由bindProperty和bindSetter返回的ChangeWatcher,并在不再使用时调用观察者的unwatch方法(即在dipose或析构函数方法中)
您需要将 [Bindable] 标记添加到类本身(使所有属性可绑定)或您想要成为 [Bindable] 的属性。在 MXML 中将属性或对象标记为 [Bindable] 是不够的。
不隶属于 StackOverflow