【问题标题】:Accessing a variable in the parent AS3 script from a child script从子脚本访问父 AS3 脚本中的变量
【发布时间】:2015-06-16 15:20:38
【问题描述】:

我在将父 AS3 脚本中的变量值传递给父调用的子 swf 时遇到问题。

孩子还有一个与之关联的 AS3 脚本。

这是一个简单的例子。这是父脚本。

package scripts {
            import flash.display.MovieClip;
            import flash.display.*;
            import flash.net.URLRequest;
            import flash.events.MouseEvent;
            import flash.events.Event;

            public class passone extends MovieClip {

                public var topVariable;

                public function passone() {

                    var button: buttonMovie = new buttonMovie();
                    button.x = 300;
                    button.y = 400;
                    button.addEventListener(MouseEvent.CLICK, onButtonClicked);
                    addChild(button);

                    topVariable = "Parent variable";
                }

                function onButtonClicked(e: MouseEvent): void {

                    trace("This is the variable: " + topVariable);
                    var myLoader: Loader = new Loader();
                    var url: URLRequest = new URLRequest("PassVariableTest2.swf");
                    myLoader.load(url);
                    myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                    //addChild(myLoader);

                    function onComplete(e: Event): void {
                        topVariable = "Parent variable";
                        addChild(myLoader);
                    }
                }
            }
        }

这是父调用的 swf 的代码。

 package scripts {
        import flash.display.MovieClip;
        import flash.text.TextField;
        import flash.events.Event;

        public class passtwo extends MovieClip {

            var topVariable

            public function passtwo() {

                //var ChildVar = MovieClip(parent.parent).topVariable;

                trace("This is being called");

                trace("The answer should follow: " +MovieClip(this.parent.parent).topVariable);
                //trace(MovieClip(this.parent));
            }
        }
    }

我尝试了几种不同的代码配置来从父脚本访问变量。

MovieClip(this.parent.parent).topVariable
MovieClip(parent.parent).topVariable
MovieClip(this.parent.parent.parent).topVariable
MovieClip(this.parent).topVariable

我真的可以使用一些帮助来解决这个问题。 我不断收到错误#1009 无法访问空对象引用的属性或方法。

【问题讨论】:

    标签: actionscript-3 variables parent-child parent


    【解决方案1】:

    MovieClip 使用强制转换确实是您在互联网上随处可见的不良做法之一。除了更加混淆问题之外,它没有任何帮助,因为它基本上所做的只是防止发生任何编译时检查,因为MovieClip 是一个dynamic 类。

    从设计的角度来看,您不希望加载的 swf 文件伸手去拿别人的东西。

    相反,以理想的方式定义行为。如果您的类需要一个值,请创建一个方法以便将其传递给它。我在这里使用了一个 set 函数,所以它可以像属性一样使用。

    package scripts 
    {
        import flash.display.Sprite;
    
        public class StringReceiver extends Sprite 
        {
            private var _text:String = "";
    
            public function StringReceiver() 
            {
            }
    
            public function set text(value:String):void
            {
                _text = value;
    
                // do stuff with the received string here, e.g.:
    
                trace(_text);
            }
        }
    }
    

    如果您将其编译成 .swf 文件并加载它,您会将其强制转换为类而不是 MovieClip。此外,除非您知道自己在做什么,否则不要将函数相互嵌套。

    package scripts 
    {
        import flash.display.Sprite;
        import flash.display.LoaderInfo;
    
        import flash.net.URLRequest;
    
        import flash.events.MouseEvent;
        import flash.events.Event;
    
        public class Main extends Sprite 
        {
            private var _message:String = "message";
    
            public function Main() 
            {
                var button: buttonMovie = new buttonMovie();
                button.x = 300;
                button.y = 400;
                button.addEventListener(MouseEvent.CLICK, onButtonClicked);
                addChild(button);
            }
    
            private function onButtonClicked(e: MouseEvent): void 
            {
                trace("This is the variable: " + _message);
                var loader: Loader = new Loader();
                var url: URLRequest = new URLRequest("PassVariableTest2.swf");
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                loader.load(url);
                addChild(loader);
            }
    
            private function onComplete(e: Event): void 
            {
                var loaderInfo:LoaderInfo = e.target as LoaderInfo;
                var receiver:StringReceiver = loaderInfo.content as StringReceiver;
    
                receiver.text = _message;
            }
        }
    }
    

    另见:http://www.scottgmorgan.com/accessing-document-class-of-externally-loaded-swf-with-as3/

    【讨论】:

    • 感谢您的回答。这有点工作。我确实发现了一些错误。在私有函数 onComplete 的主脚本中,receiver 的 var 应该是 var receiver:StringReceiver = loaderInfo.content as StringReceiver。最后一个 StringReceiver 中有空间。而在 StringReceiver 的脚本中, public set function Text(value:String){ 应该是 public function set text(value:String){ set 在错误的地方。但没有你的帮助,我不知道如何做到这一点。为此,我真的要感谢您的快速回复。
    • @DavidYoung 我的错,我应该提到我只是在浏览器中输入它以了解解决方案的外观并且没有对其进行测试。感谢您指出这些错误,我在回答中修正了它们。下次随意直接编辑帖子。鼓励在本网站上编辑其他人的帖子。欢迎来到stackoverflow =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多