2015-06-19 2 views
1

У меня есть коллекция, которую я хочу, чтобы связать в качестве входных данных для ComboBox:Двунаправленное связывание для Flex ComboBox?

private static var LOGOS:ArrayCollection = new ArrayCollection([ 
{index:0, label=logo1}, 
{index:1, label=logo2} 
]); 

<s:ComboBox selectedItem="@{model.labelIndex}" labelField="@label" dataProvider="{LOGOS}" /> 

Теперь при выборе пункта, связывание необходимо отправить соответствующий index свойство objext модели и обновления labelIndex. Конечно, это не работает, как указано выше, потому что labelIndex имеет тип данных, отличный от ArrayCollection.

[Bindable] 
private var model:MyModel; 

[Bindable] 
class MyModel { 
    public var:Number labelIndex; 
} 

Вопрос: как я могу сопоставить элемент массива с моделью и наоборот?

ответ

2

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

Вы можете использовать класс BindingUtils для определения привязок и использовать аргумент chain метода bindProperty, чтобы изменить способ поиска значений.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/binding/utils/BindingUtils.html

Для combo.selectedItem к model.labelIndex связывания, вы можете указать цепочку как массив, в котором элементы определяют путь, где искать значения:

BindingUtils.bindProperty(model, 'labelIndex', combo, ['selectedItem', 'index']); 

Это связывается с selectedItem и передать стоимость товаров index.

Другой путь немного сложнее и потребует использование функции геттера, которая захватывает объект из источника данных, на основе labelIndex значения:

BindingUtils.bindProperty(combo, 'selectedItem', model, { 
    name: 'labelIndex', 
    getter: function(host:MyModel):Object 
    { 
     return LOGOS.source.filter(function(item:Object, index:int, array:Array):Boolean 
     { 
      return item.index === host.labelIndex; 
     })[0]; 
    } 
}); 

Это будет связываться с labelIndex собственности, при изменении свойства будет вызываться функция getter. Функция будет фильтровать источник данных на основе измененных моделей значений свойства labelIndex и вернуть исходный объект с соответствующим значением свойства index, которое, наконец, будет установлено для свойства combobox selectedItem.

Ваше определение выпадающий будет, конечно, нужен id для того, чтобы можно было выполнять с помощью сценария

<s:ComboBox id="combo" dataProvider="{LOGOS}" /> 

Обратите внимание, что нет никакой необходимости Forthe в @ в labelField собственности, это используется только с XML-источников данных, где вам нужно для задания атрибута. Однако на самом деле вам не нужно указывать это вообще, поскольку label является значением по умолчанию для свойства labelField.

+0

Но что, если 'index' не является последовательностью, например,' 1,2,5,17'? Будет ли ваш код работать с этим? – membersound

+0

@membersound Я неправильно понял ваш вопрос, см. Мой обновленный ответ. –

+0

Спасибо за ваше обновление. В любом случае это действительно сложный код для простого простого флажка с поданными данными.Я имею в виду, что для инфраструктуры пользовательского интерфейса обычно необходимо иметь какой-то объект данных в качестве источника данных для флажка, где выбор должен отображать только частичные свойства объекта, а ссылка на модель должна также просто использовать частичные свойства (в мой случай: индекс элемента, который будет сохраняться в БД, чтобы пользовательские настройки могли быть восстановлены при входе в систему). Разве нет более простого способа сделать это? – membersound

Смежные вопросы