これはmxml内のコンポーネントメソッドを呼び出す正しい方法ですか?
-
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>