1

parentDocumentFlex SDK 4.1 と 4.5 の間でいくつかの不一致が見られます。簡単に言えば、4.1 で動作する既存のコードは 4.5 (および 4.6) では壊れています。以下に示す小さな例を示します。

TestProject.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx"
               minWidth="500" minHeight="500" xmlns:local="*">

    <local:SubComponent x="50" y="50"/>
</s:Application>

サブコンポーネント.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"
         width="200" height="200">

    <fx:Script>
        <![CDATA[
            import spark.components.Application;

            protected function button1_clickHandler(event:MouseEvent):void
            {
                var app:Application = this.parentDocument as Application;

                if (app != null) {
                    trace('Good');
                } else {
                    trace('Bug');
                }
            }
        ]]>
    </fx:Script>

    <s:Button x="18" y="20" label="Button" click="button1_clickHandler(event)"/>
</s:Group>

4.1 SDK を使用すると、Applicationを介してオブジェクトを正常に取得できますparentDocument。ただし、これは 4.5 SDK では失敗します。4.5 ではparentDocument、スキン オブジェクトになりました。

"parentDocument"    spark.skins.spark.ApplicationSkin (@9d7e479)

2 レベル上がると、Application オブジェクトを正常に取得できます。

"parentDocument.parentDocument"    TestProject (@9d7e0a1)   

parentDocumentしたがって、に置き換えることで問題を回避できparentDocument.parentDocumentます。ただし、この変更が今後も一貫性があると期待できる期待される動作なのか、それとも将来的に修正される可能性が高いバグなのかはわかりません。物事をやっています。だから、私の質問は次のとおりです。

  1. 他の誰かがこの問題に遭遇しましたか? もしそうなら、どのように対処しましたか?
  2. 回避策を開発した場合、そのソリューションは特定の SDK バージョンに依存していますか、それともすべての SDK バージョンで機能しますか?
  3. 4.1 から 4.5 への動作の変更は意図的なものでしたか、それともバグですか? バグの疑いがありますが、いずれにしても決定的なものを見つけることができませんでした。

上記の私の例は、最小限のコードと最小限の複雑さで問題を示すために工夫されていることに注意してください。私の実際のプロジェクトでは、サブコンポーネントを含むモジュールがあり、サブコンポーネントに(経由で)TitleWindowメソッドを呼び出させようとしています。そのため、サブコンポーネントは実際にはではなくを探しているため、オブジェクトを見つける他の方法を含む回避策は実際には適用できません。TitleWindowparentDocumentApplicationTitleWindowApplication

4

2 に答える 2

2

ええ、これはバグではありません。これは、実際には spark コンポーネントの「機能」です。基本的に、SkinnableContainers (TitleWindow) の場合、子は実際にはコンポーネント スキンの contentGroup に追加されます。このリンクこのリンクには、すべてを説明するいくつかの優れた記事があります。多くのシナリオでは、コードを .owner プロパティにすばやく変更して (子オブジェクトが DisplayObject である限り)、目的の結果を得ることができます。より良いアプローチは、コードの一部をリファクタリングして、スキンが提供するビューのカプセル化により適合させることです (親のメソッドにアクセスしようとするのではなく、子コンポーネントにイベントを発生させます...そのようなこと)。ただし、スキンの内部の仕組みをすべて理解すると、かなりクールなものになります。

お役に立てれば。

于 2012-10-31T07:17:16.610 に答える
1

3.x と 4.x の間で確実に変更されました。ポイントリリース間でも、よりエキサイティングになった可能性があります。詳細はこちら: http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7e3a.html

于 2012-10-30T14:51:50.580 に答える