【问题标题】:Flex/Actionscript : passing data from custom class to main application?Flex/Actionscript:将数据从自定义类传递到主应用程序?
【发布时间】:2011-08-04 19:38:53
【问题描述】:

好吧,这听起来可能很愚蠢,但我是 Flex 编程的初学者。

我有一个带有主 .mxml 文件的应用程序,以及我从 .mxml 调用的某个类 Foo

在 Foo 中,我创建了一个 URLRequest 并监听 Co​​mplete 事件。然后我发现自己在 Foo 函数中返回了数据,但我不知道如何将它传达给应用程序的 .mxml 部分!我查看了 ArrayCollections 但我似乎无法理解它们是如何工作的以及它是否有帮助。没有办法从类内部修改具有全局范围的变量吗?

【问题讨论】:

    标签: apache-flex actionscript scope


    【解决方案1】:

    这听起来像是一个小型应用程序,但如果它是一个大型应用程序,您可能需要查看像 RobotLegs 这样的微框架

    如果您的 Foo 类扩展了 EventDispatcher,那么它将能够发送事件并让主 MXML 应用程序监听所述事件。

    package com.example
    {
        import flash.events.EventDispatcher;
        import com.example.events.MyEvent;
    
        public class Foo extends EventDispatcher 
        {
            public function doAction():void 
            {
                var someData:String = "blah";
                dispatchEvent(new MyEvent(MyEvent.SOMETHING_HAPPENED, someData));
            }
        }
    }
    

    带有负载的自定义事件(在本例中为字符串)

    package com.example.events 
    {
        import flash.events.Event;
    
        public class MyEvent extends Event 
        {
            static public const SOMETHING_HAPPENED:String = "somethingHappened";
    
            private var _myData:String;
    
            public function get myData():String 
            {
                return _myData;
            }
    
            public function MyEvent(type:String, myData:String, bubbles:Boolean=false, cancelable:Boolean=false) 
            {
                _myData = myData;
                super(type, bubbles, cancelable);
            }
    
            override public function clone():Event 
            {
                return new MyEvent(type, myData, bubbles, cancelable);
            }
        }
    }
    

    使用主文件中的 Foo 类:

    public function EventDispatcherExample() {
        var foo:Foo = new Foo();
        foo.addEventListener(MyEvent.SOMETHING_HAPPENED, actionHandler);
        foo.doAction();
    }
    
    private function actionHandler(e:MyEvent):void {
        trace("my data is: " + e.myData);
    }
    

    【讨论】:

    • 好的,所以我能够捕捉到该事件,但是如何将变量附加到该事件^^?
    • erm 那么 Foo 何时将值传递给事件?
    • 好的,Flex 在实例化 MyEvent 时需要两个参数
    • 值(上面的 'someData' 变量)作为创建新 MyEvent 时的第二个参数作为 dispatchEvent 的参数传递... dispatchEvent(new MyEvent(MyEvent.SOMETHING_HAPPENED, someData)) ;
    • 击败了我 :) 是的,这就是创建自定义事件的好处,有效负载是必需的,并且它也会对它进行类型检查,因此您不会错误地传递错误的东西。
    【解决方案2】:
    import mx.core.FlexGlobals;
    FlexGlobals.toplevelApplication.varName;
    

    【讨论】:

      【解决方案3】:

      您的 Foo 类可以调度一个事件,并在您的 main.mxml 中有一些东西来监听该事件。我确信我可以创建一个示例。我认为这是在 Flex 文档中的客户事件下。这是假设我理解这个问题。

      【讨论】:

      • 无论我导入哪个包,DispatchEvent 都不会在类中工作!但它可以在主 .mxml 中使用
      【解决方案4】:

      正如约翰所说,活动是您的最佳选择。

      如果您想要一些示例代码,我在此处为类似问题提供了一些示例代码:Data from Popup to Main Application?

      【讨论】:

        【解决方案5】:

        如前所述,活动可能是最好的方式。 另一种方法是调度这样的事件

        dispatchEvent(new Event('somethingHappened'));
        

        并在您的类中为您需要获取的数据创建一个 get 方法。

        那么你在你的主应用中所要做的就是这个

        var foo:Foo = new Foo();
        foo.addEventListener('somethingHappened', actionHandler);
        
        private function actionHandler(e:Event):void 
        {
            trace(foo.memberData);
        }
        

        如果数据无论如何都应该是类成员并且您想避免创建新的事件类,这种方式可能更合适。

        【讨论】:

        • 好的,但是 Foo 仍然应该扩展 DispatchEvent 类,对吧?因为dispatchEvent 行会出现在你知道的 Foo 类中
        猜你喜欢
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 2012-05-18
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多