2009-12-28 55 views
0

我必須填充高級數據網格,其中包含以下字段: Continent-> State-> Society - > Actual Value - > Estimate Value I想要模擬金融市場,所以我必須通過來自HTTPService的異步請求來更改一些值;你有什麼想法嗎? 謝謝。 如果需要,我會發布.as文件,但它是由Flex Builder自動生成的。從動態HTTPService獲取數據異步以填充高級數據網格Flex

這裏的客戶機側的Flex /空氣的應用程序的代碼:

<?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> 

這裏的。作爲文件..

/** * ActionScript源文件,它定義UI邏輯和一些數據訪問代碼。 *使用mx:Script標記將此文件鏈接到主應用程序MXML文件中。 *該文件中的大部分函數都由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的常量定義 包括「provaconfig.as」;

/** * 網關:這是與服務器側PHP代碼通信層 */ 私人VAR網關:的HTTPService =新的HTTPService();

/** * 陣列集合保存,我們在網格使用 */ [綁定] 公共變種dataArr行:ArrayCollection的=新ArrayCollection的();

/** *我們點的列。每次用戶點擊 *網格列標題時都會更新。 *參見headerRelease =「setOrder(event);」在 * mxml文件中的DataGrid實例中 */ private var orderColumn:Number;

/** * 字段的數據庫表 *解析響應入散列 */ 私有變種字段所需的列表:對象= { 'continente':字符串, 'stato':字符串;' societa':字符串,'actual':數字,'估計':數字};

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

}

/** *不允許主鍵列的編輯。 * @參數ê的DataGridEvent包含有關用戶點擊 電網 *的行和列的詳細信息*/ 私有函數editCellHandler(E:AdvancedDataGridEvent):無效 { /** * 如果用戶點擊了主鍵列,停止編輯 */ if(e.dataField ==「continenteCol」) { e.preventDefault(); return; } }

/** *單擊「過濾器」按鈕的處理程序。 *當設置另一個過濾器時,刷新集合並加載新數據 */ private function filterResults():void { fill();無效 {VAR dsRowIndex: }

/** * 當用戶完成編輯條目 *觸發 「更新」 服務器命令 */ 私有函數editCellEnd(:AdvancedDataGridEvent E)事件處理函數觸發: 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:對象):無效 { 如果(e.isError) { Alert.show(「Error:」+ e.data.error); } 其他 {}
}

/** * 處理dragHeader爲DataGrid。當在標題欄中的用戶 *單擊DataGrid *更新全局變量orderColumn,刷新有關列的 */ 私有函數setOrder(:AdvancedDataGridEvent事件)的TableCollection *參數事件的DataGridEvent細節執行此處理: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,「估計」:estimateCol.text};

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

}

/** * 用於插入調用結果處理程序。 *警報的錯誤,如果它存在 *如果呼叫通過確定去了,回到列表,並刷新數據 */ 私有函數insertItemHandler(E:對象):無效 { 如果(e.isError) Alert.show(「Error:」+ e.data.error); } else { 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(E:對象):無效 { 如果(e.isError) { Alert.show(「Error:」+ e.data.error); } else { dataArr.removeAll(); (var row:e.data中的XML)。行) { var temp: = {}; (var key:字段中的字符串) 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); 
} 

}

/** *按下 * Delete按鈕時,確認對話框的事件處理程序功能會發生。 *如果按下按鈕爲是,則刪除產品。 * @參數對象事件 * @返回沒什麼 / 私有函數deleteClickHandler(事件:的closeEvent):無效 { 如果(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:*):空隙 { 如果(e.isError) { Alert.show( 「錯誤:」 + e.data.error); } else var continente:Number = parseInt(e.data.toString(),10); 爲(VAR指數:編號= 0;索引< dataArr.length;索引++){ 如果 (dataArr [指數] .continenteCol == continente) { dataArr。removeItemAt(索引); 休息; }} }
}

/** * 反序列化XML響應 *處理錯誤的情況下 * *參數Ë的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; 

}

/** 爲網關 * *結果處理反序列化結果,然後調用REAL事件處理程序 *(使在doRequest功能的請求時設置) * * @參數Ë的ResultEvent有關連接 / 公共函數resultHandler(E:的ResultEvent):服務器響應和細節上的空隙 { VAR topass: = deserial ize(e.result,e); e.token.handler.call(null,topass); }

/** * 此連接故障處理程序 * * @參數Ë的FaultEvent錯誤對象 */ 公共函數faultHandler(E:的FaultEvent):無效 { 變種的errorMessage:字符串=「連接錯誤:「+ e.fault.faultString; if(e.fault.faultDetail) errorMessage + =「\ n \ n其他詳細信息:」+ e.fault.faultDetail; } Alert.show(errorMessage); }

/** * 使得使用網關實例到所述服務器的請求 * * @參數METHOD_NAME字符串中的服務器所使用的方法名稱dispathcer * @參數參數對象名值對在郵寄(:字符串參數:對象,回調:功能METHOD_NAME):無效 {// 的方法添加到參數表 參數當調用完成 */ 公共職能doRequest被稱爲 * @參數回調函數的函數['method'] = method_name;

gateway.request = parameters; 

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

call.handler = callback; 

}

/** * 點擊處理程序,當用戶點擊 「創建」 按鈕 *載入 「更新」 畫布。 */ public function goToUpdate():void { applicationScreens.selectedChild = update; }

/** *加載「查看」畫布。 */ public function goToView():void { applicationScreens。selectedChild = view; }

私有函數adg_itemClick(E:的ListEvent):無效 { 變種項:對象= AdvancedDataGrid(e.currentTarget).selectedItem; e.target.expandItem(item,!e.target.isItemOpen(item),true);

}

回答

0

可能會更容易回答,如果我能看到整個應用程序,但在這裏它是一個刺,如果我明白你的問題......我不太清楚異步的重點...到在某種程度上,http是異步的。但是,如果您的目標是從應用程序服務器/數據庫推送數據,那麼答案會有所不同,並且涉及使用BlazeDS/LCDS或這些技術的OSS克隆之一,在這些情況下,您不使用mx:反正HttpService。這是你的意思嗎?

如果不是,那麼很明顯,您需要在MXML中定義一個HttpService,並且您希望將其結果事件綁定到一個ActionScript函數,該函數可以在任何時候更改{dataArr}(Array,ArrayCollection ??)服務回報。如果您需要它來「輪詢」您的服務以進行更改,我想您可以使用Timer對象或其他方法來做到這一點,但如果這是必不可少的,我會考慮使用LCDS。

+0

我編輯添加。至於文件 我絕對不能,我會恢復對這個項目使用blaze,lcds或類似的東西。 我只想要實際和估計字段隨機變化,即使不是全部,也不是全部。 在此先感謝。 – Franky 2009-12-28 15:09:04

+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鏈接到的例子。 – 2009-12-30 18:21:38

0

我試圖使用FLEX 3中的相同內置代碼。我着迷於可以直接在創建的列表(更改我的數據庫表的內容)更改數據的方式。 現在我嘗試爲某些字段合併富文本編輯器。我試圖使用一個被調用的行(selectedItem),現在我能夠獲取數據 - 但面臨的問題是我不能編輯字段中的文本 - (錯誤1009)(某事沒有實例化)我現在將嘗試在另一個步驟 - 某種編輯 - 但它不是異步。

另一個機會是使用creationComplete將所選行的數據獲取到表單中,然後使用與列表uses.i.e直接更新數據庫相同的功能。

我的應用程序在本地主機上運行,​​部署到託管服務器可能會創建一些沙箱問題?再有就是沒有辦法,只能使用AMFPHP或ZENDamf - BlazeDS的

時,我已經整理出了問題

問候

+0

如果您可以找到基於ZENDamf或BlazeDS的解決方案,它可能對我的項目 最好的問候有用 – Franky 2010-01-17 02:34:42