FLEX - конвертировать AsyncToken в ArrayCollection
Я новичок, чтобы сгибать, и я не могу заставить это работать. По сути, у меня есть поле выбора, с которым доступные данные зависят от другого поля со списком.
Есть несколько типов обработки в каждом типе категории.
Вот мой код:
Изменение поля со списком; Обновите поле выбора:
private function refreshAvailableTreatmentTypes():void {
// this is the combo box
fAccomplishment.habitatType = habitatTypeId.selectedIndex != -1 ? habitatTypeId.selectedItem as HabitatType : null;
// fAccompRemote is a RemoteObject
var treatmentList:ArrayCollection = fAccompRemote.getValidTreatments(fAccompForm.accomplishment, fAccomplishment.habitatType);
if ( fAccompForm.categoryTypes != null ) {
// All categories are always shown. These are passed to the form on construction.
for each ( var currentCat:CategoryType in fAccompForm.categoryTypes ) {
var catAdded:Boolean = false;
/* loop through all the treatments in each Category and add them to
* the available list if they meet the criteria */
for each ( var currentTreat:TreatmentType in currentCat.treatments ) {
if (currentTreat.id in treatmentList || treatmentList.length == 0) {
if (!catAdded) {
// fCatsAndTreats defined as a [Bindable] private var
fCatsAndTreats.addItem( currentCat );
catAdded = true;
}
fCatsAndTreats.addItem( currentTreat );
}
}
}
}
}
Метод обслуживания:
@RemotingInclude
public List<TreatmentType> getValidTreatments(Accomplishment accomp, HabitatType selectedHabitatType){
if ( accomp == null || accomp.getGeometry() == null || accomp.getHabitatType() == null) {
return new ArrayList<TreatmentType>();
}
Geometry accompGeo = accomp.getGeometry();
List<TreatmentType> optionList = new ArrayList<TreatmentType>();
String geomName = null;
if ( accompGeo instanceof Point || accompGeo instanceof MultiPoint ) {
geomName = "Point";
} else if ( accompGeo instanceof LineString || accompGeo instanceof MultiLineString) {
geomName = "Line";
} else if ( accompGeo instanceof Polygon || accompGeo instanceof MultiPolygon ) {
geomName = "Polygon";
}
Integer habTypeId = null;
if (selectedHabitatType == null) {
habTypeId = accomp.getHabitatType().getId();
} else {
habTypeId = selectedHabitatType.getId();
}
optionList = accomplishmentDao.getValidTreatments(geomName, habTypeId);
return optionList;
}
Ошибка типа: Ошибка № 1034: сбой приведения типа: невозможно преобразовать mx.rpc::AsyncToken@1af48641 в mx.collections.ArrayCollection.
Как мне это сделать? Я нашел ЭТО, но это, кажется, не очень мне помогает. Любые ресурсы или информация будет принята с благодарностью.
1 ответ
Вызовы RemoteObject являются асинхронными - возвращаемое значение из fAccompRemote.getValidTreatments является AsyncToken, который определяет, как будут обрабатываться результаты (когда они возвращаются).
Когда удаленный вызов возвращается, он вызывает либо обработчик результатов, либо обработчик ошибок, в зависимости от того, был ли вызов успешным или имел ошибку.
Существует несколько различных способов настройки обработчика ответа для вашего кода - вы можете добавить addEventListener для вызова или установить ответчик в AsyncToken, возвращаемом из вызова.
fAccompRemote.addEventListener(ResultEvent.RESULT, resultHandler);
fAccompRemote.getValidTreatments(...)
-или же-
var token:AsyncToken = fAccompRemote.getValidTreatments(...);
token.addResponder(new AsyncResponder(resultHandler, faultHandler));
В любом случае, resultHandler
получает событие ResultEvent с ArrayCollection, из которого вы вернулись getValidTreatments
protected function resultHandler(event:ResultHandler):void
{
var results:ArrayCollection = event.result as ArrayCollection;
}