0

次のフィールドを持つ高度なデータグリッドにデータを入力する必要があります。大陸->州->社会->実際の値->推定値金融市場をシミュレートしたいので、非同期リクエストで値の一部を変更する必要がありますHTTPServiceから; あなたはそうするためのアイデアを持っていますか?ありがとうございました。必要に応じて.asファイルを投稿しますが、FlexBuilderによって自動的に生成されます。

クライアント側の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ファイルです。

/ ***UIロジックと一部のデータアクセスコードを定義するActionScriptソースファイル。*このファイルは、mx:Scriptタグを使用してメインアプリケーションのMXMLファイルにリンクされています。*このファイルのほとんどの関数は、MXMLで定義された*イベントハンドラーによって呼び出されます。 /flash.eventsをインポートします。;

import mx.collections.ArrayCollection; import mx.controls.AdvancedDataGrid; import mx.controls.Alert; import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; importmx.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);"を参照してください *mxmlファイルのDataGridインスタンス化*/private var orderColumn:Number;

/***データベーステーブル内のフィールドのリスト*応答をハッシュに解析するために必要*/private var fields:Object = {'continente':String、'stato':String、'societa':String、'actual' :Number、'estimate':Number};

/ ***mxmlのロードが完了すると実行されます。RestGatewayを初期化します。* /プライベート関数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 {/ ** *ユーザーが主キー列をクリックした場合は、編集を停止します* / if(e.dataField == "continenteCol"){e.preventDefault(); 戻る; }}

/***「フィルター」ボタンのハンドラーをクリックします。*別のフィルターを設定する場合は、コレクションを更新し、新しいデータをロードします* / private function 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);    

}

/***「update」サーバーコマンドの結果ハンドラー。*エラーを警告するか、問題がない場合は何もしません-データはすでにグリッドで更新されています* / private function saveItemHandler(e:Object):void {if(e.isError){Alert.show( "Error: "+ e.data.error); } else{}
}

/***データグリッドのdragHeaderハンドラー。このハンドラーは、ユーザーが*データグリッドのヘッダー列をクリックしたときに実行されます*グローバルorderColumn変数を更新し、TableCollectionを更新します* @parameventDataGridEvent列に関する詳細*/private function setOrder(event: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、 "estimate":estimateCol.text};

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

}

/***挿入呼び出しの結果ハンドラー。*存在する場合はエラーを警告します*呼び出しが正常に行われた場合は、リストに戻り、データを更新します* / private function insertItemHandler(e:Object):void {if(e.isError){Alert.show( "Error :"+ e.data.error); } else {goToView(); 塗りつぶし(); }
}

/***データを更新するための一般的なユーティリティ関数*フィルタリングと順序付けを取得してから新しいサーバー呼び出しをディスパッチします**/ private function fill():void {/***順序パラメーターを検索します*/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に新しいデータを再入力します* / private function fillHandler(e:Object):void {if(e.isError){Alert.show( "Error:" + e.data.error); } else {dataArr.removeAll(); for each(var row:XML in e.data.row){var temp: = {}; for(var key:String in fields){temp [key +'Col'] = row [key]; }

        dataArr.addItem(temp);
    }

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

}

/***リスト内の「削除」ボタンのハンドラーをクリックします*アクションを確認してdeleteClickHandler関数を起動します*/private function deleteItem():void {

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

}

/ ** * [削除]ボタンを押すと、[確認]ダイアログのイベントハンドラー機能が発生します。※押されたボタンが「はい」の場合、商品は削除されます。*@paramオブジェクトイベント*@returnnone / 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);
}

}

public function deleteHandler(e:*):void {if(e.isError){Alert.show( "Error:" + 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応答を逆シリアル化します*エラーケースを処理します**@parameResultEventサーバー応答と接続に関する詳細 /publicfunction 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関数でリクエストを行うときに設定されます)* * @parameResultEventサーバーの応答と接続 /パブリック関数の詳細resultHandler(e:ResultEvent):void {var topass: = deserialize(e.result、e); e.token.handler.call(null、topass); }

/***この接続のフォールトハンドラー**@parameFaultEventエラーオブジェクト*/public function faultHandler(e:FaultEvent):void {var errorMessage:String = "Connection error:" + e.fault.faultString; if(e.fault.faultDetail){errorMessage + = "\ n \ n追加の詳細:" + e.fault.faultDetail; } Alert.show(errorMessage); }

/***ゲートウェイインスタンスを使用してサーバーにリクエストを送信します**@parammethod_name文字列サーバーディスパスで使用されるメソッド名*@paramparametersポストで送信するためのオブジェクト名と値のペア*@paramcallback呼び出しが完了します*/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;

}

/***ユーザーが[作成]ボタンをクリックしたときにハンドラーをクリックします*[更新]キャンバスをロードします。* / public function goToUpdate():void {applicationScreens.selectedChild = update; }

/***「表示」キャンバスをロードします。* / public function 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);

}

4

2 に答える 2

0

FLEX 3 と同じ組み込みコードを使用しようとしています。作成したリストで直接データを変更できる方法 (データベース テーブルの内容を変更する方法) に魅了されています。ここで、一部のフィールドにリッチ テキスト エディターを組み込んでみます。

呼び出された行 (selectedItem) を使用しようとしていますが、データを取得できるようになりました - しかし、フィールド内のテキストを編集できないという問題に直面しています - (エラー 1009)(何かがインスタンス化されていません)私は今、別のステップを入れようとします - ある種の編集 - しかし、それは非同期ではありません。

別の機会として、creationComplete を使用して、選択した行のデータをフォームに取得し、リストが使用するのと同じ機能を使用します。つまり、データベースを直接更新します。

私のアプリケーションはローカル ホストで実行されています。ホストされたサーバーにデプロイすると、サンドボックスの問題が発生する可能性がありますか? そして、amfphpまたはZENDamfを使用するしか方法がありません - blazeDS

問題が解決したら元に戻します

よろしく

于 2010-01-16T11:26:32.437 に答える
0

アプリ全体を見ることができれば答えやすいかもしれませんが、あなたの質問を理解していれば、ここでそれを突き刺します...非同期の強調については明確ではありません...ある程度、httpは非同期です。ただし、目的がアプリ サーバー/データベースからのデータ プッシュである場合、答えは異なり、BlazeDS/LCDS またはこれらのテクノロジの OSS クローンの 1 つを使用する必要があり、その場合は mx を使用していません。とにかくHttpService。これはあなたが意味したものですか?

そうでない場合は、明らかに、MXML で定義された HttpService が必要であり、その結果イベントを、サービスが戻るたびに {dataArr} (配列、配列コレクション??) を変更する ActionScript 関数にバインドする必要があります。サービスの変更を「ポーリング」する必要がある場合は、Timer オブジェクトなどを使用してそれを行うことができると思いますが、これが不可欠な場合は LCDS を検討します。

于 2009-12-28T12:56:25.813 に答える