2009-12-28 5 views
0

Я должен заполнить расширенную информационную сетку, которая имеет следующие поля: Континент-> Государство-> Общество -> Фактическое значение -> Значение оценки 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);

}

ответ

0

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

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

+0

Я отредактированные добавив .as файл Я абсолютно не могу используйте blaze, lcds или аналогичный для этого проекта. Я хочу, чтобы только фактические и оценочные поля менялись случайным образом, даже не все, а не toegether. Спасибо заранее. – Franky

+0

это помогает? 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. –

0

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

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

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

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

я вернуться, когда я выяснял проблему

приветы

+0

, если вы можете найти решение на основе ZENDamf или BlazeDS, это может быть полезно для моего проекта с наилучшими пожеланиями – Franky