2

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>

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

4

2 に答える 2

7

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

ドキュメントから:

< mx:Component >タグは、MXMLファイル内の新しいスコープを定義します。アイテムレンダラーまたはアイテムエディターのローカルスコープは、< mx :Component>タグと< / mx:Component >タグで区切られたMXMLコードブロックによって定義されます。 。アイテムレンダラーまたはアイテムエディターのローカルスコープ外の要素にアクセスするには、要素名の前に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>
于 2009-10-28T14:27:44.417 に答える
1

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>
于 2009-10-28T15:01:10.450 に答える