0

私はフレックス/フラッシュを学んでいますが、これで迷っています。一連のビューで「データ」を使用しましたが、正常に動作します。何らかの理由で、ここでは機能していません。

ここでフィールドを文字列に設定します。

function LoginLoaded (e:Event):void {
                    trace(e.target.data);
                    var ServerReturn:String;
                    ServerReturn = new String(e.target.data);
                    data.UserCommonReturnData = ServerReturn;
                    navigator.pushView(CommonPlaces, data);
                }

そして、ここで一般的な場所のビューで、私はそれを読み戻そうとします:

var CommonPlacesData:String = new String();
            var CurrentSelect:String = new String();
            CommonPlacesData = new String(data.UserCommonReturnData);

これにより、「未定義のプロパティデータへのアクセス」というエラーが発生します。 data.PickUpTime (文字列でもあります) などの呼び出しが他のビューで正常に機能するため、取得できません。

データは次のように最初のビューで始まります。

[Bindable] public var User:ObjectProxy = new ObjectProxy();

User.ID = "2314084";
navigator.pushView(TaxiNowOrLaterView, User);

その後、後のビューで次のように呼び出します:(正常に動作します)

var PickUpString:String = new String(data.ID);

どんな助けでも素晴らしいでしょう!! ありがとう!!!

4

1 に答える 1

1

あなたのコードにはいくつかのことがあります。まず、言語に適した識別子に名前を付ける習慣を身に付ける必要があります。大文字で始まり、その後、単語の残りの論理部分に小さな文字を使用する識別子 (PascalCase とも呼ばれるシステム) は、クラスに名前を付けるためにのみ使用されます。残りの識別子は camelCase を使用する必要があります (PascalCase に似ていますが、最初の文字は大文字ではありません)**。これにより、コードを理解するための労力が大幅に削減されます。ベテランの AS3 プログラマーは、コードを次のように解釈します。

// Static constant (!) ID of the class User is assigned (?) a value of "2314084"
User.ID = "2314084";
// invoke a method pushView of a local variable navigator with arguments
// of which first is the class TaxiNowOrLater, the second is the class User
navigator.pushView(TaxiNowOrLaterView, User);

おそらく、あなたはそれを意味していませんでした。

new String();

AS3 のコンテキストではまったく意味がありません。文字列は決して参照ではなく、不変であり、大多数のプログラマーが合意したリテラル構文を持っています。上記のコードは と同じです""。同様に、 とnew String(anotherString)まったく同じ効果がありanotherStringます。

あなたの質問: event.target多くの異なるものである可能性があり、その中には「データ」と呼ばれるプロパティがあるものとないものがあります。この問題への一般的なアプローチは、値をキャストするevent.currentTargetevent.target、イベントをディスパッチすると予想される型にキャストする必要があるということです。Buttonクラスのインスタンスからのイベントを期待しているとします。

private function clickHandler(event:MouseEvent):void {
    if (Button(event.currentTarget).enabled) // do things
}

同じイベントがボタンではないオブジェクトによってディスパッチされた場合、これはエラーから保護しませんが、エラーレポートをより意識的にします。これは、どのクラスが他のどのクラスにキャストしようとしていたかを示すためです、失敗したとき。

プログラム ロジックで、ハンドラーが処理すべきではないイベントを認識する必要がある場合 (理由は?)、次のように記述できます。

private function clickHandler(event:MouseEvent):void {
    var button:Button = event.currentTarget as Button;
    if (button && button.enabled) // do things
}

event.targetvs event.currentTarget- が必要になることはほとんどありませんがevent.target、ほとんどの場合は が必要currentTargetです。それが間違っているとは言いませんが、問題があるようです。targetイベントの最初の原因となったオブジェクトです。イベントはバブリングする場合があります。つまり、イベントは表示リスト階層を上下に、最初は親から子へ、次に逆方向に移動する可能性があります。以下の例では、ボタンにラベルがあり、イベントが生成された後にクリックされたとします。この場合、ボタンにリスナーを追加したとしても、ボタンでevent.targetはなくボタン ラベルになります。currentTarget逆に、イベントをハンドラーにディスパッチした即時オブジェクトです。

さらにいくつかのこと:ObjectProxyはばかげたクラスです。おそらく、どのイベントでも使用しないでください。それは何の役にも立ちませんし、おそらくバグがありますが、これまでそのバグを発見しようとする人はほとんどいませんでした。簡単に言えば、それが行うことは次のとおりです。オブジェクトを作成し、動的な作成、そのプロパティの割り当て、および削除を「監視」し、これらのイベントが発生したときにイベントをディスパッチします。この動作は、多くのエラーや暗黙のバグを引き起こしやすい傾向があります。たとえばfoo.bar = "baz"; foo.bar = "baz";、同じプロパティの再割り当てですか? foo.bar.baz = "fizzbuzz";の修正ですかfoo.bar?プロパティ名が文字列でない場合はどうなりますか? 等々。

使用しない理由: データを処理するためのより良い方法が常にあります。より透過的で、デバッグしやすく、より効率的です。このクラスは、実際に機能したことのないプロトタイプです。上記の動作に加えて、それを記述するために使用されたコード行の点で巨大です。内部で発生するエラーをデバッグするには、多くの時間と忍耐が必要ですが、それだけの価値はありません。

ユーザーを表すオブジェクトが必要な場合は、ユーザーが持つと予想されるプロパティを使用してクラスを定義し、そのクラスを使用するだけです。これにより、コードのデバッグと理解がはるかに簡単になります。

[Bindable]メタデータは悪です。あまりにも頻繁に使用されるため、避けるべきだとは言えませんが、そうします。できるだけ避けるべきです。このメタの使用が正当化される例にはまだ遭遇していません。プロトタイプと同じような精神でObjectProxy、パフォーマンスやコーナーケースをあまり考慮しない怠惰なプログラマー向けに設計されたものです。これも、多くの暗黙のバグの原因であり、通常、このメタの周りで生成されたコードがエラーを「飲み込む」ため、発見するのが困難です。このメタに代わるものはaddEventListener(...)、カスタム イベントを含むプレーン コードです。

残念ながら、多くのチュートリアルでは、この種のコードを使用して、言語とフレームワークをすぐに使い始めることができます...

** この規則にはいくつかの例外があります。定数はすべて大文字で、名前空間名は単語の論理部分を区切るためにアンダースコアを使用しますが、大文字は使用しないでください。

于 2012-07-06T14:57:21.147 に答える