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”并添加 externaldocument 关键字,如下所示:

<?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 回答