Получение данных из динамического HTTPService Асинхронно для заполнения Advanced Data Grid Flex

Мне нужно заполнить расширенную сетку данных, в которой есть следующие поля: Континент-> Состояние-> Общество -> Фактическое значение -> Расчетное значение Я хочу смоделировать финансовый рынок, поэтому мне нужно изменить некоторые значения с помощью асинхронного запроса. из HTTPService; у тебя есть идеи сделать это? Спасибо. При необходимости я отправлю файл .as, но он автоматически создается Flex Builder.

Вот код клиентского приложения 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>

Here's the .as file..

/ ** * Исходный файл ActionScript, который определяет логику пользовательского интерфейса и часть кода доступа к данным. * Этот файл связан с основным файлом MXML приложения с помощью тега mx: Script. * Большинство функций в этом файле вызываются обработчиками событий, * определенными в MXML. / import flash.events.;

import mx.collections.ArrayCollection; import mx.controls.AdvancedDataGrid; import mx.controls.Alert; import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; import mx.events. *; import mx.managers.CursorManager; import mx.rpc.AsyncToken; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService;

// включаем постоянное определение URL-адреса конечной точки сервера include "provaconfig.as";

/ ** * шлюз: это уровень связи с php-кодом на стороне сервера * / private var gateway: HTTPService = new HTTPService ();

/ ** * коллекция массивов содержит строки, которые мы используем в сетке * / [Bindable] public var dataArr: ArrayCollection = new ArrayCollection ();

/ ** * столбец, по которому мы упорядочиваем. Он обновляется каждый раз, когда пользователи нажимают * заголовок столбца сетки. * см. headerRelease = "setOrder (event);" в экземпляре DataGrid в файле * mxml * / private var orderColumn: Number;

/ ** * список полей в таблице базы данных, * необходимых для разбора ответа на хэши * / private var fields: Object = {'continente': String, 'stato': String, 'societa': String, 'actual' : Number, 'оценка': Number};

/ ** * Выполняется, когда mxml полностью загружен. Инициализируйте шлюз отдыха. * / частная функция initApp (): void {

/**
 * 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();

}

/ ** * Запрещает редактирование столбца первичного ключа. * @param e DataGridEvent содержит сведения о строке и столбце сетки, * где пользователь щелкнул * / private function editCellHandler (e: AdvancedDataGridEvent): void {/ ** * если пользователь щелкнул столбец первичного ключа, прекратить редактирование * / если (e.dataField == "continenteCol") {e.preventDefault (); возвращение; }}

/ ** * Обработчик кликов для кнопки «Фильтр». * При установке другого фильтра обновите коллекцию и загрузите новые данные * / частная функция filterResults (): void {fill (); }

/ ** * Обработчик событий запускается, когда пользователь заканчивает редактирование записи * запускает серверную команду «обновить» * / private function editCellEnd (e: AdvancedDataGridEvent): void {var 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 (e: Object): void {if (e.isError) {Alert.show ("Ошибка: "+ e.data.error); } else {}
}

/ ** * обработчик dragHeader для таблицы данных. Этот обработчик выполняется, когда пользователь * щелкает столбец заголовка в таблице данных * обновляет глобальную переменную orderColumn, обновляет сведения о столбце DataGridEvent события TableCollection * @param * / частную функцию setOrder (событие: AdvancedDataGridEvent): void {orderColumn = event.columnIndex; var col: AdvancedDataGridColumn = dataGrid.columns [orderColumn]; col.sortDescending =! col.sortDescending;

event.preventDefault();
fill();

}

/ ** * Обработчик нажатия кнопки «Сохранить» в состоянии «Добавить» * собирает информацию в форме и добавляет новый объект в коллекцию / private function insertItem (): void {var parameters: = {"method": "Insert", "continente": continenteCol.text, "stato": statoCol.text, "societa": societaCol.text, "actual": actualCol.text, "оценка": EstimationCol. текст};

/**
 * execute the server "insert" command
 */
doRequest("Insert", parameters, insertItemHandler);

}

/ ** * Обработчик результата для вызова вставки. * Предупредить об ошибке, если она существует *, если вызов прошел успешно, вернуться к списку и обновить данные * / private function insertItemHandler (e: Object): void {if (e.isError) {Alert.show ("Ошибка : "+ e.data.error); } еще {goToView (); наполнять(); }
}

/ ** * общая служебная функция для обновления данных * получает фильтрацию и упорядочивание, затем отправляет новый вызов сервера * * / private function fill (): void {/ ** * найти параметры порядка * / var desc: Boolean = ложный; 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);

}

/ ** * обработчик результата для вызова fill. * если это ошибка, показать ее пользователю, иначе пополнить коллекцию массивов новыми данными * / private function fillHandler (e: Object): void {if (e.isError) {Alert.show ("Error : "+ e.data.error); } еще {dataArr.removeAll (); для каждого (var row: XML в e.data.row) {var temp: = {}; for (var key: строка в полях) {temp [key + 'Col'] = row [key]; }

        dataArr.addItem(temp);
    }

    CursorManager.removeBusyCursor();
    dataGrid.enabled = true;
}    

}

/ ** * Обработчик клика для кнопки «удалить» в списке * подтверждает действие и запускает функцию deleteClickHandler * / частная функция deleteItem (): void {

if (dataGrid.selectedItem)
{
    Alert.show("Are you sure you want to delete the selected record?",
    "Confirm Delete", 3, this, deleteClickHandler);
}

}

/ ** * Функция обработчика событий для диалогового окна подтверждения возникает при нажатии кнопки * Удалить. * Если нажата кнопка «Да», то товар удаляется. * событие объекта @param * @return ничего / private function deleteClickHandler (event: CloseEvent): void {if (event.detail == Alert.YES) {var vo: = dataGrid.selectedItem;

    var parameters:* =
    {
        "continente": vo.continenteCol
    }

    /**
     * execute the server "delete" command
     */
    doRequest("Delete", parameters, deleteHandler);

    setTimeout( function():void
    {
        dataGrid.destroyItemEditor();
    },
    1);
}

}

публичная функция deleteHandler (e: *): void {if (e.isError) {Alert.show ("Ошибка:" + e.data.error); } else {var continente: Number = parseInt (e.data.toString (), 10); for (var index: Number = 0; index ‹dataArr.length; index ++) {if (dataArr [index] .continenteCol == continente) {dataArr.removeItemAt (index); ломать; }}}
}

/ ** * десериализует ответ xml * обрабатывает случаи ошибок * * @param e ResultEvent ответ сервера и сведения о соединении / public function deserialize (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;

}

/ ** * обработчик результата для шлюза * десериализует результат, а затем вызывает обработчик REAL события * (устанавливается при выполнении запроса в функции doRequest) * * @param e ResultEvent ответ сервера и подробные сведения о соединении / публичная функция resultHandler (e: ResultEvent): void {var topass: = deserialize (e.result, e); e.token.handler.call (ноль, topass); }

/ ** * обработчик ошибок для этого соединения * * @param e FaultEvent объект ошибки * / публичная функция faultHandler (e: FaultEvent): void {var errorMessage: String = "Ошибка соединения:" + e.fault.faultString; if (e.fault.faultDetail) {errorMessage + = "\ n \ nДополнительная информация:" + e.fault.faultDetail; } Alert.show (errorMessage); }

/ ** * делает запрос к серверу, используя экземпляр шлюза * * @param method_name String имя метода, используемое в диспетчере сервера * @param parameters Пары значений имени объекта для отправки в сообщении * @param callback Функция функции, которая будет вызываться, когда вызов завершается * / public function doRequest (method_name: String, parameters: Object, callback: Function): void {// добавляем метод в список параметров parameters ['method'] = method_name;

gateway.request = parameters;

var call:AsyncToken = gateway.send();
call.request_params = gateway.request;

call.handler = callback;

}

/ ** * Обработчик кликов, когда пользователь нажимает кнопку «Создать» * Загружает холст «Обновить». * / публичная функция goToUpdate (): void {applicationScreens.selectedChild = update; }

/ ** * Загружаем холст «Просмотр». * / публичная функция goToView (): void {applicationScreens.selectedChild = view; }

частная функция adg_itemClick (e: ListEvent): void {var item: Object = AdvancedDataGrid (e.currentTarget) .selectedItem; e.target.expandItem (item,! e.target.isItemOpen (item), true);

}


person Fsee    schedule 28.12.2009    source источник


Ответы (2)


Было бы легче ответить, если бы я мог видеть все приложение, но вот удар, если я понимаю ваш вопрос ... Я не понимаю, что делает акцент на асинхронности ... в какой-то степени http является асинхронным. Если, однако, вы стремитесь к передаче данных с сервера / базы данных приложений, тогда ответ будет другим и включает использование BlazeDS / LCDS или одного из клонов OSS этих технологий, и в этих случаях вы не используете mx: В любом случае HttpService. Вы это имели в виду?

Если нет, то, очевидно, вам понадобится HttpService, определенный в вашем MXML, и вы захотите, чтобы это событие результата было привязано к функции ActionScript, которая изменяет ваш {dataArr} (Array, ArrayCollection ??) всякий раз, когда служба возвращается. Если вам нужно «опросить» вашу службу на предмет изменений, я полагаю, вы могли бы сделать это с помощью объекта Timer или чего-то еще, но я бы подумал о LCDS, если это необходимо.

person Robert Neville    schedule 28.12.2009
comment
Я отредактировал добавление файла .as, я абсолютно не могу использовать пламя, ЖК-дисплей или подобное для этого проекта. Я хочу, чтобы случайным образом менялись только фактические и оценочные поля, пусть не все и не все вместе. Заранее спасибо. - person Fsee; 28.12.2009
comment
это помогает? cookbooks.adobe.com/ Что-то о вашем коде: gateway.request = parameters; вызов var: AsyncToken = gateway.send (); call.request_params = gateway.request; call.handler = обратный вызов; кажется неправильным. Я всегда делал это, как в приведенном примере Adobe. - person Robert Neville; 30.12.2009

Я пытаюсь использовать тот же встроенный код из FLEX 3. Меня восхищает способ изменения данных непосредственно в созданном списке (изменение содержимого таблицы моей базы данных). Теперь я экспериментирую с включением редактора форматированного текста для некоторых полей.

Я пытаюсь использовать вызываемую строку (selectedItem), и теперь я могу получить данные, но столкнулся с проблемой, заключающейся в том, что я не могу редактировать текст в поле - (ошибка 1009) (что-то не создается) Теперь я попытаюсь сделать еще один шаг - какое-то редактирование - но это не асинхронно.

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

Мое приложение работает на локальном хосте, развертывание на размещенном сервере может вызвать проблемы с песочницей? и тогда нет другого выхода, кроме как использовать amfphp или ZENDamf - blazeDS

Я вернусь, когда решу проблему

С уважением

person glensbo    schedule 16.01.2010
comment
если вы сможете найти решение на основе ZENDamf или BlazeDS, это может быть полезно для моего проекта с наилучшими пожеланиями - person Fsee; 17.01.2010