Как мне реализовать привязку данных в классе ActionScript?
-
23-08-2019 - |
Вопрос
У меня возникла проблема с привязкой значений в моих компонентах ActionScript.По сути, я хочу установить значение переменной a в моем компоненте равным значению в модели, и чтобы переменная компонента автоматически обновлялась при обновлении значения модели.Я думаю, что я просто не до конца понимаю, как работает привязка данных в 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.
Кроме того, будьте осторожны с ручной привязкой данных, это может привести к утечке памяти.Чтобы избежать их, сохраните ChangeWatcher, возвращаемый BindProperty и bindSetter, и вызовите метод unwatch наблюдателя, когда он больше не используется (т. е. в методе dipose или destructor)
Вам нужно добавить тег [Bindable] либо к самому классу (делая все свойства привязываемыми), либо к свойствам, которые вы хотите сделать [привязываемыми].Пометить свойства или объекты как [Bindable] в вашем MXML недостаточно.