Apache flex 这是在mxml中调用组件方法的正确方法吗

Apache flex 这是在mxml中调用组件方法的正确方法吗,apache-flex,mxml,itemrenderer,Apache Flex,Mxml,Itemrenderer,我正在努力学习Flex,发现了一些奇怪的行为。当我试图编译代码时,抛出了这个错误:调用一个可能未定义的方法UpdateStore。我以前曾以这种方式使用过方法调用,在这种情况下无法发现哪里出了问题。以下是组件的代码: <?xml version="1.0" encoding="utf-8"?> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA

我正在努力学习Flex,发现了一些奇怪的行为。当我试图编译代码时,抛出了这个错误:调用一个可能未定义的方法UpdateStore。我以前曾以这种方式使用过方法调用,在这种情况下无法发现哪里出了问题。以下是组件的代码:

<?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父标记

标记定义了一个新的 MXML文件中的作用域,其中 项目渲染器的本地范围或 项编辑器由MXML定义 由 及 标签。访问外部的元素 项目呈现器的本地范围 或项目编辑器,则为元素添加前缀 使用outerDocument关键字命名

因此,您需要公开“UpdateStore”并添加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>

[事件(name=“myEvent”,type=“flash.events.Event”)]
以下是在单独的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>

StoryEditor.mxml:
[事件(name=“myEvent”,type=“flash.events.Event”)]

要添加更多细节。。。mx:Component实际上只是创建了一个新类,该类在基于列表的控件中为每个可见项实例化一次。outerDocument是该类中对创建该类的对象的引用。+1您的解决方案为我指明了正确的方向。在我的案例中,我使用了parentDocument而不是outerDocument。