Search code examples
actionscript-3flashapache-flexswfloader

Pass data between embedded SWF and Flex


I have a Flex project with an SWF object embedded with SWFLoader:

<mx:SWFLoader id="mySWFLoader" source="@Embed('Plant_Walking.swf')" creationComplete="onComplete()" />

The onComplete() function is embedded in the mxml file:

<fx:Script>
    <![CDATA[

        public function onComplete() : void {
            mySWFLoader.content.addEventListener( "featureSelected" , handleEvent );
        }

        public function handleEvent( evt:Event ):void
        {

            var selectedInfo : String = mySWFLoader.content['itemname'];

            textinput.text = selectedInfo;
            label.text = selectedInfo;
        }


    ]]>
</fx:Script>

Inside this SWF object, written in AS3, when I click an object happens this:

itemname=ev.object.name;
dispatchEvent(new Event("featureSelected", true));

It call the event featureSelected and then it will call the handleEvent function. The problem is that I don't receive the value of the itemname parameter and, even though the parameter is declared in the SWF object:

public var itemname:String = "test";

I receive this error at runtime:

[Fault] exception, information=ReferenceError: Error #1069: Property itemname not found on Main__embed_mxml_Plant_Walking_swf_1661400095 and there is no default value.

Why? Thank you


Solution

  • Write following in your code. It will give the value.

    var selectedInfo : String = evt.itemname;
    

    Instead of:

    var selectedInfo : String = mySWFLoader.content['itemname'];
    

    Edit:

    If above not work then, create custom event like:

    public class FeatureSelectedEvent extends Event
    {
        public static var FEATURE_SELECTED:String = "featureSelected";
    
        private var _itemname:String;
        public function get itemname():String { return _itemname }
    
        public function FeatureSelectedEvent (type:String, itemname:String, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type,bubbles,cancelable);
            _itemname = itemname;
        }
    
        override public function clone():Event
        {
            return new FeatureSelectedEvent(type, itemname, bubbles, cancelable);
        }
    }
    

    Then dispatch event like:

    dispatchEvent(new FeatureSelectedEvent(FeatureSelectedEvent.FEATURE_SELECTED, ev.object.name));
    

    You get parameter value like:

    public function handleEvent( evt:Event ):void
     {
        var selectedInfo : String = event.itemname;
     }
    

    Sorry, for any spelling mistake.