これはmxml内のコンポーネントメソッドを呼び出す正しい方法ですか?

StackOverflow https://stackoverflow.com/questions/1637469

  •  07-07-2019
  •  | 
  •  

質問

私はFlexを学習する方法をハックしており、奇妙な動作を発見しました。コードをコンパイルしようとすると、次のエラーがスローされます-エラー:未定義の可能性のあるメソッドupdateStoryを呼び出します。以前にこの方法でメソッド呼び出しを使用したことがありますが、この場合に何が問題になっているのかがわかりません。コンポーネントのコードは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">

  <mx:Script>
    <![CDATA[

    import mx.collections.ArrayCollection;

    [Bindable]
    public var storyCards:ArrayCollection;

    private function updateStory():void
    {
       trace("success");
    }   

    ]]>
  </mx:Script>

  <mx:TileList dataProvider="{storyCards}" >

    <mx:itemRenderer>

      <mx:Component>

    <mx:HBox>
      <mx:Label />
      <mx:TextInput keyUp="updateStory()" />
      <mx:TextArea text="{data.notes}" />
    </mx:HBox>

      </mx:Component>

    </mx:itemRenderer>

  </mx:TileList>
</mx:Canvas>

誰かが私を正しい方向に向けることができますか?

役に立ちましたか?

解決

問題はmx:Component親タグにあります。

ドキュメントから:

  

<!> lt; mx:Component <!> gt;タグは新しい   MXMLファイル内のスコープ。   アイテムレンダラーのローカルスコープまたは   アイテムエディターはMXMLによって定義されます   で区切られたコードブロック   <!> lt; mx:Component <!> gt;および<!> lt; / mx:Component <!> gt;   タグ。外部の要素にアクセスするには   アイテムレンダラーのローカルスコープ   またはアイテムエディタ、要素のプレフィックス   outerDocumentキーワードを使用した名前。

したがって、次のように「updateStory」を公開し、outerdocumentキーワードを追加する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
    <![CDATA[

    import mx.collections.ArrayCollection;

    [Bindable]
    public var storyCards:ArrayCollection;

    public function updateStory():void
    {
       trace("success");
    }       
    ]]>
</mx:Script>
<mx:TileList dataProvider="{storyCards}" >
       <mx:itemRenderer>
            <mx:Component>
                <mx:HBox>
                 <mx:Label />
                 <mx:TextInput keyUp="outerDocument.updateStory()" />
                 <mx:TextArea text="{data.notes}" />
                </mx:HBox>
            </mx:Component>
        </mx:itemRenderer>
    </mx:TileList>
</mx:Canvas>

他のヒント

ItemRendererコンポーネントからイベントをディスパッチし、メインドキュメントにリスナーを追加することもできます。これは、ItemRendererコンポーネントを別のMXMLコンポーネントファイルに移植する場合に役立ちます。

ここにコードがあります:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
        <![CDATA[

        import mx.collections.ArrayCollection;

        [Bindable]
        public var storyCards:ArrayCollection;

        private function updateStory():void
        {
           trace("success");
        }       

        ]]>
  </mx:Script>

  <mx:TileList dataProvider="{storyCards}" myEvent="updateStory();">

        <mx:itemRenderer>

          <mx:Component>
            <mx:Metadata>
                [Event(name="myEvent", type="flash.events.Event")]
            </mx:Metadata>

        <mx:HBox>
          <mx:Label />
          <mx:TextInput keyUp="dispatchEvent(new Event('myEvent', true))" />
          <mx:TextArea text="{data.notes}" />
        </mx:HBox>

          </mx:Component>

        </mx:itemRenderer>

  </mx:TileList>
</mx:Canvas>

別のMXMLコンポーネントで使用する方法は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
  <mx:Script>
        <![CDATA[

        import mx.collections.ArrayCollection;

        [Bindable]
        public var storyCards:ArrayCollection;

        private function updateStory():void
        {
           trace("success");
        }       

        ]]>
  </mx:Script>

  <mx:TileList dataProvider="{storyCards}" myEvent="updateStory();" itemRenderer="StoryEditor" />
</mx:Canvas>

StoryEditor.mxml:

<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Metadata>
        [Event(name="myEvent", type="flash.events.Event")]
    </mx:Metadata>

    <mx:Label />

    <mx:TextInput keyUp="dispatchEvent(new Event('myEvent', true));" />

    <mx:TextArea text="{data.notes}" />
</mx:HBox>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top