Я должен заполнить расширенную информационную сетку, которая имеет следующие поля: Континент-> Государство-> Общество -> Фактическое значение -> Значение оценки I хотите имитировать финансовый рынок, поэтому мне нужно изменить некоторые значения по асинхронному запросу из HTTPService; у вас есть идея сделать это? Спасибо. При необходимости я отправлю файл .as, но он автоматически создается Flex Builder.Получить данные из динамического HTTPService Асинхронно для заполнения расширенной сетки данных данных
Вот код на стороне клиента Flex/Air приложений:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
pageTitle="prova"
creationComplete="initApp()" backgroundGradientColors="[#ffffff, #ffffff]">
<mx:ViewStack id="applicationScreens" width="100%" height="100%">
<mx:Canvas id="view" width="100%" height="100%">
<mx:AdvancedDataGrid id="dataGrid" initialize="gc.refresh();"
borderColor="#000000"
selectionMode="singleRow"
rowCount="8"
editable="false"
lockedColumnCount="1"
right="10" left="10" top="10" bottom="71" itemClick="adg_itemClick(event);">
<mx:dataProvider>
<mx:GroupingCollection id="gc" source="{dataArr}">
<mx:grouping>
<mx:Grouping>
<mx:GroupingField name="continenteCol">
<mx:summaries>
<mx:SummaryRow summaryPlacement="group">
<mx:fields>
<mx:SummaryField dataField="actualCol"
operation="SUM"/>
<mx:SummaryField dataField="estimateCol"
operation="SUM"/>
</mx:fields>
</mx:SummaryRow>
</mx:summaries>
</mx:GroupingField>
<mx:GroupingField name="statoCol">
<mx:SummaryRow summaryPlacement="group">
<mx:fields>
<mx:SummaryField dataField="actualCol"
operation="SUM" />
<mx:SummaryField dataField="estimateCol"
operation="SUM"/>
</mx:fields>
</mx:SummaryRow>
</mx:GroupingField>
</mx:Grouping>
</mx:grouping>
</mx:GroupingCollection>
</mx:dataProvider>
<mx:columns>
<mx:AdvancedDataGridColumn resizable="false" headerText="continente" dataField="continenteCol" />
<mx:AdvancedDataGridColumn headerText="stato" dataField="statoCol" />
<mx:AdvancedDataGridColumn headerText="societa" dataField="societaCol" />
<mx:AdvancedDataGridColumn headerText="actual" dataField="actualCol" />
<mx:AdvancedDataGridColumn headerText="estimate" dataField="estimateCol" />
</mx:columns>
</mx:AdvancedDataGrid>
<mx:Button id="btnAddNew" click="goToUpdate()" icon="@Embed('icons/AddRecord.png')" toolTip="Add Record" x="10" bottom="10"/>
<mx:Button id="btnDelete" click="deleteItem()" icon="@Embed('icons/DeleteRecord.png')" toolTip="Delete Record" x="58" bottom="10"/>
<mx:Label text="Search by continente" right="300" bottom="11"/>
<mx:TextInput id="filterTxt" width="238" toolTip="Search by continente" enter="filterResults()" right="58" bottom="11"/>
<mx:Button click="filterResults()" id="filterButton" icon="@Embed('icons/SearchRecord.png')" toolTip="Search by continente" right="10" bottom="10"/>
</mx:Canvas>
<mx:Canvas id="update" width="100%" height="100%">
<mx:Form width="100%" height="80%" id="provaForm">
<mx:FormItem label="Continente:" id="continente_form">
<mx:TextInput id="continenteCol" text=""/>
</mx:FormItem>
<mx:FormItem label="Stato:" id="stato_form">
<mx:TextInput id="statoCol" text=""/>
</mx:FormItem>
<mx:FormItem label="Societa:" id="societa_form">
<mx:TextInput id="societaCol" text=""/>
</mx:FormItem>
<mx:FormItem label="Actual:" id="actual_form">
<mx:TextInput id="actualCol" text=""/>
</mx:FormItem>
<mx:FormItem label="Estimate:" id="estimate_form">
<mx:TextInput id="estimateCol" text=""/>
</mx:FormItem>
</mx:Form>
<mx:Button label="Save" id="btnSubmit" click="insertItem()" right="81" bottom="10"/>
<mx:Button label="Cancel" id="btnCancel" click="goToView()" right="10" bottom="10"/>
</mx:Canvas>
</mx:ViewStack>
Вот файл .as ..
/** * ActionScript исходный файл, который определяет интерфейс логики и некоторого кода доступа к данным. * Этот файл привязан к основному файлу приложения MXML, используя тег mx: Script. * Большинство функций в этом файле вызывается обработчиками событий, определенными в * MXML. / импорт flash.events.;
импорт mx.collections.ArrayCollection; импорт mx.controls.AdvancedDataGrid; импорт mx.controls.Alert; import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; импорт mx.events. *; импорт mx.managers.CursorManager; import mx.rpc.AsyncToken; import mx.rpc.events.FaultEvent; импорт mx.rpc.events.ResultEvent; импорт mx.rpc.http.HTTPService;
// включать постоянное определение конечной точки сервера включает в себя «provaconfig.as»;
/** * шлюз: это слой связи с кодом на стороне сервера PHP */ частный вар шлюз: HTTPService = новый HTTPService();
/** * коллекция массив содержит строки, которые мы используем в сетке */ [Bindable] общественный вар dataArr: ArrayCollection = новый ArrayCollection();
/** * column это заказываем. Это обновляется каждый раз, когда пользователи нажимают на заголовок столбца *. * см. HeaderRelease = "setOrder (event);" в экземпляре DataGrid в файле * mxml */ private var orderColumn: Number;
/** * список полей в таблице базы данных *, необходимой для анализа ответа в хэшей */ частные вар поля: Object = { 'Continente': String, 'Stato': String ' societa ': String,' actual ': Number,' evaluation ': Number};
/** * Выполняется при заполнении mxml. Инициализация шлюза отдыха. */ частная функция initApp(): пустота {
/**
* initialize the gateway
* - this will take care off server communication and simple xml protocol.
*/
gateway.url = ENDPOINT_URL;
gateway.method = "POST";
gateway.useProxy = false;
gateway.resultFormat = "e4x";
/**
* set the event handler which prevents editing of the primary key
*/
dataGrid.addEventListener(AdvancedDataGridEvent.ITEM_EDIT_BEGINNING, editCellHandler);
/**
* set the event handler which triggers the update actions - everytime an
* edit operation is finished
*/
dataGrid.addEventListener(AdvancedDataGridEvent.ITEM_EDIT_END, editCellEnd);
gateway.addEventListener(ResultEvent.RESULT, resultHandler);
gateway.addEventListener(FaultEvent.FAULT, faultHandler);
fill();
}
/** * Disallow редактирование столбца первичного ключа. * @param е DataGridEvent содержит подробную информацию о строке и столбце сетки *, где пользователь нажал */ частная функция editCellHandler (е: AdvancedDataGridEvent): пустота { /** * если пользователь нажал на столбец первичного ключа, прекратить редактирование */ if (e.dataField == "continenteCol") { e.preventDefault(); возвращение; } }
/** * Обработчик кликов для кнопки «Фильтр». * При настройке другого фильтра обновите коллекцию и загрузите новые данные */ фильтр частных функцийРезультаты(): void { fill(); }
/** * обработчик события вызывается, когда пользователь завершает редактирование записи * запускает "обновление" команду сервера */ частной функция editCellEnd (е: AdvancedDataGridEvent): недействительный { уага dsRowIndex: int = e.rowIndex; var dsFieldName: String = e.dataField; var dsColumnIndex: Number = e.columnIndex;
var vo:* = dataArr[dsRowIndex];
var col:AdvancedDataGridColumn = dataGrid.columns[dsColumnIndex];
var newvalue:String = dataGrid.itemEditorInstance[col.editorDataField];
trace("a:" + dsRowIndex + ", " + dsFieldName + ", " + dsColumnIndex);
var parameters:* =
{
"continente": vo.continenteCol, "stato": vo.statoCol, "societa": vo.societaCol, "actual": vo.actualCol, "estimate": vo.estimateCol }
parameters[dsFieldName.substr(0,dsFieldName.length-3)] = newvalue;
/**
* execute the server "update" command
*/
doRequest("Update", parameters, saveItemHandler);
}
/** * результат обработчика для команды сервера "обновление". * Просто предупредить ошибку, или ничего не делать, если это нормально - данные уже * была обновлена в сетке */ частная функция saveItemHandler (е: Object): аннулируются { если (e.isError) { Alert.show ("Ошибка:" + e.data.error); } еще { }
}
/** * dragHeader обработчик для DataGrid. Этот обработчик выполняется, когда пользователь * нажимает на заголовке столбца в сетке * обновляет глобальную переменную orderColumn, обновляет TableCollection * DataGridEvent @param событие подробности о колонке */ частная функция SetOrder (событие: AdvancedDataGridEvent) : void { orderColumn = event.columnIndex; var col: AdvancedDataGridColumn = dataGrid.columns [orderColumn]; col.sortDescending =! Col.sortDescending;
event.preventDefault();
fill();
}
/** * Нажмите обработчик для кнопки «Сохранить» в «Добавить» состояние * собирает информацию в форме и добавляет новый объект в коллекцию / частной функций InsertItem(): недействительный { параметров Var: = { "метод" : "Вставить", "Continente": continenteCol.text, "Stato": statoCol.text, "Societa": societaCol.text, «actual»: actualCol.text, «оценка»: оценкаCol.text};
/**
* execute the server "insert" command
*/
doRequest("Insert", parameters, insertItemHandler);
}
/** * Результат обработчик для вызова вставки. * Оповещение об ошибке, если он существует *, если вызов прошел нормально, вернитесь к списку, и обновить данные */ частная функция insertItemHandler (е: Object): аннулируются { если (e.isError) { Alert.show ("Ошибка:" + e.data.error); } { goToView(); fill(); }
}
/** * общая функция полезности для обновления данных * получает фильтрацию и упорядочение, а затем отправляет новый запрос на сервер * */ частная функция заполнения(): недействительным { /** * найти параметры заказа */ var desc: Boolean = false; var orderField: String = '';
if(!isNaN(orderColumn))
{
var col:AdvancedDataGridColumn = dataGrid.columns[orderColumn];
desc = col.sortDescending;
//remove the 'Col' particle
orderField = col.dataField.substr(0,col.dataField.length-3);
}
dataGrid.enabled = false;
CursorManager.setBusyCursor();
var parameters:* =
{
"orderField": orderField,
"orderDirection": (desc) ? "DESC" : "ASC",
"filter": filterTxt.text
}
/**
* execute the server "select" command
*/
doRequest("FindAll", parameters, fillHandler);
}
/** * результат обработчика для вызова заполнения. * если это ошибка, показать его пользователю, еще пополнить ArrayCollection с новыми данными * / приватная функция fillHandler (е: Object): аннулируются { если (e.isError) { Alert.show ("Ошибка:" + e.data.error); } Остальные { данныеArr.removeAll(); для каждого (строка var: XML в e.data.строка) { var temp: = {}; for (var key: String in fields) { temp [key + 'Col'] = row [key]; }
dataArr.addItem(temp);
}
CursorManager.removeBusyCursor();
dataGrid.enabled = true;
}
}
/** * Нажмите обработчик для кнопки "Удалить" в списке * подтверждает действие и запускает функцию deleteClickHandler */ приватная функция DeleteItem(): пустота {
if (dataGrid.selectedItem)
{
Alert.show("Are you sure you want to delete the selected record?",
"Confirm Delete", 3, this, deleteClickHandler);
}
}
/** * Функция обработчика события для диалога подтверждения поднимается при нажатии кнопки удаления *. * Если нажата кнопка «Да», продукт удаляется. * @param объект события * @return ничего / частная функция deleteClickHandler (событие: CloseEvent): аннулируются { если (event.detail == Alert.YES) { вар VO: = dataGrid.selectedItem ;
var parameters:* =
{
"continente": vo.continenteCol
}
/**
* execute the server "delete" command
*/
doRequest("Delete", parameters, deleteHandler);
setTimeout(function():void
{
dataGrid.destroyItemEditor();
},
1);
}
}
публичную функцию УдалитьОбработчик (е *): пустота { , если (e.isError) { Alert.show ("Ошибка:" + e.data.error); } else { var continente: Number = parseInt (e.data.toString(), 10); для (индекс вар: Number = 0; индекс < dataArr.length; индексной ++) { , если (dataArr [Индекс] .continenteCol == Continente) { dataArr.removeItemAt (индекс); break; }} }
}
/** * десериализует ответ XML * обрабатывает случаи ошибок * * @param е ResultEvent ответ сервера и подробности о связи / общественная функция десериализации (obj:, e: ): { var toret: Object = {};
toret.originalEvent = e;
if (obj.data.elements("error").length() > 0)
{
toret.isError = true;
toret.data = obj.data;
}
else
{
toret.isError = false;
toret.metadata = obj.metadata;
toret.data = obj.data;
}
return toret;
}
/** * результата обработчик для шлюза * десериализует результат, а затем вызывает обработчик реального события * (устанавливается при выполнении запроса в функции doRequest) * * @param электронной ResultEvent ответа сервера и подробные сведения о соединении / публичную функцию ResultHandler (е: ResultEvent): аннулируются { вар topass: = deserial ize (e.result, e); e.token.handler.call (null, topass); }
/** * обработчик ошибок для этого соединения * * @param е FaultEvent объект ошибки */ общественная функция faultHandler (е: FaultEvent): аннулируются { вар ErrorMessage: String = " Ошибка подключения: «+ e.fault.faultString; if (e.fault.faultDetail) { errorMessage + = "\ n \ n \ n \ nAdditional detail:" + e.fault.faultDetail; } Alert.show (errorMessage); }
/** * делает запрос к серверу, используя экземпляр шлюза * * @param имя_метод Строки имени методы, используемое в сервере dispathcer * Параметры объект @param пары значений имени для отправки в сообщении * функция @param обратного вызова функции вызываются, когда завершается выполнение */ общественной функция doRequest (METHOD_NAME: String, параметры: Object, обратный вызов: функция): аннулируется { // добавить метод в список параметров параметров ['method'] = имя метода;
gateway.request = parameters;
var call:AsyncToken = gateway.send();
call.request_params = gateway.request;
call.handler = callback;
}
/** * Нажмите обработчик, когда пользователь нажимает кнопку "Создать" кнопку * Загрузить "Обновить" холст. */ public function goToUpdate(): void { applicationScreens.selectedChild = update; }
/** * Загрузить холст «Вид». */ общественная функция goToView(): void { applicationScreens.selectedChild = view; }
частные функции adg_itemClick (е: ListEvent): недействительным элемент { вар: Объект = AdvancedDataGrid (e.currentTarget) .selectedItem; e.target.expandItem (item,! E.target.isItemOpen (item), true);
}
Я отредактированные добавив .as файл Я абсолютно не могу используйте blaze, lcds или аналогичный для этого проекта. Я хочу, чтобы только фактические и оценочные поля менялись случайным образом, даже не все, а не toegether. Спасибо заранее. – Franky
это помогает? http://cookbooks.adobe.com/post_Tracking_results_from_multiple_simultaneous_servic-922.html Кое-что о вашем коде: gateway.request = parameters; var call: AsyncToken = gateway.send(); call.request_params = gateway.request; call.handler = callback; похоже неправильный. Я всегда делал это как пример Adobe. –