0

Zend AMF から受け取った後、Flex オブジェクト (ArrayCollection) の値にアクセスできません。送信される元の型は PHP 連想配列で、次のように単純に返されます。

return $this->sections['initial_setup'];

PHP 変数ビュー:

可変ビューのセクション配列

送信される必要な結果は、Charles AMF RPC タブで次のようになります。

Charles プロキシ AMF RPC ビュー

しかし、Flex でデータを Object (または String[] - 関係ありません) として受け取ると、そのようなコードでプロパティ値にアクセスできません。

    var result:Object = event.result;
    if (result['database'] == 'yes' && result['admin'] == 'yes')
        // continue branch ...

そして、if-lineで例外が発生します:

    Error: Unknown Property: 'database'.
        at mx.collections::ListCollectionView ...

最後に、Eclipse 変数ビューで、ResultEvent インスタンスが長さ 0 の ArrayCollection 型の結果を保持し、受け取った値が D アイコンで表示されることを確認できます (D 装飾の意味がわかりませんでした)。

ResultEvent 変数

しかし、なぜ私はまだそれらにまったくアクセスできないのですか?それらを使用するにはどうすればよいですか?

Object の代わりに Array または ArrayCollection の型を変更しようとしました。同様の問題について議論しているスレッドもありますが、それを試してみても役に立ちません。

どんな助けでも大歓迎です:o)

編集 1: ConfigurationService の FB 生成スーパー クラス コンストラクターのコードは次のとおりです。

    // Constructor
public function _Super_ConfigurationService()
{
    // initialize service control
    _serviceControl = new mx.rpc.remoting.RemoteObject();

    // initialize RemoteClass alias for all entities returned by functions of this service

    var operations:Object = new Object();
    var operation:mx.rpc.remoting.Operation;

    operation = new mx.rpc.remoting.Operation(null, "readSettings");
     operation.resultType = Object;
    operations["readSettings"] = operation;
    operation = new mx.rpc.remoting.Operation(null, "writeSettings");
    operations["writeSettings"] = operation;
    operation = new mx.rpc.remoting.Operation(null, "readDBSettings");
     operation.resultType = valueObjects.ConnectionParams;
    operations["readDBSettings"] = operation;
    operation = new mx.rpc.remoting.Operation(null, "writeDBSettings");
    operations["writeDBSettings"] = operation;
    operation = new mx.rpc.remoting.Operation(null, "readInitSetupCompletion");
     operation.resultType = Object;
    operations["readInitSetupCompletion"] = operation;
    operation = new mx.rpc.remoting.Operation(null, "writeInitSetupCompletion");
    operations["writeInitSetupCompletion"] = operation;

    _serviceControl.operations = operations;
    _serviceControl.convertResultHandler = com.adobe.serializers.utility.TypeUtility.convertResultHandler;
    _serviceControl.source = "ConfigurationService";
    _serviceControl.endpoint = "gateway.php";


     preInitializeService();
     model_internal::initialize();
}
4

1 に答える 1

1

ここで起こったことは、ArrayCollection のソースとして機能している Array が、同じ 2 つのプロパティを持つ汎用オブジェクトとして機能していることです。おそらく、生成されたコードは、常に複数のオブジェクトが返されることを想定しており、Adobe のエンジニアが作成した想定をデータが満たさない場合に問題が発生しています。生成されたコードが嫌いな理由の 1 つ :-)。

「独自にロールする」方法については、これらのリソースを確認してください。

  1. リモーティングについて
  2. AMFPHP から Flex オブジェクトへのリレーショナル マッピング
  3. PHP サービスの実装

この最後の (3) は、おそらく PHP にあるものに最も近いと思います。VO を使用することに決めた場合は、行の戻り値に $explicitType を追加するだけで済み、PHP 側で他に多くの変更を加える必要はありません。生成されたコードが異なると思われるため、そのルートに進む場合は、おそらくサービスを再生成する必要があります。幸いなことに、アドビのエンジニアはおそらく、明示的な型を持ち、レコードが 1 つしかない場合を考えていました

もう 1 つの修正方法は、AC が null ではない長さ 0 のソースを持っていることを確認し、その端にあるプロパティを探すことです。

于 2012-06-23T02:52:03.257 に答える