在父级中从子动画片段中获取变量? Flash AS3

时间:2011-09-20 21:15:09

标签: flash actionscript-3 variables

我在子MC中定义了一些变量:

var first_nme = data.return_first;
    var second_nme = data.return_second;
    var email_addr = data.return_email;
    var user_domain = data.return_domain;
    var user_name = data.return_username;

我正在尝试在父动画片段/另一个动画片段中使用这些变量。

我尝试了跟踪方法:

    trace(MovieClip(verif).first_nme);

//'verif' is the mc name

    trace(MovieClip(parent).first_nme);

以上两者都为var first_nme返回了一个未定义的错误。

谁能告诉我如何正确地做到这一点?

感谢

修改

儿童:

function completeHandler(event:Event):void{

    // Load the response from the PHP file
    var data:URLVariables = new URLVariables(event.target.data);
    var returnn_stat = data.return_status;
    var ffferror256 = data.return_value;
    returnn_stat = returnn_stat.replace(/\s/m, "");


    if (returnn_stat == "FAILED"){
    status_txt.text = ffferror256;

    }
    else if (returnn_stat == "PASSED"){

    var first_nme = data.return_first;
    var second_nme = data.return_second;
    var email_addr = data.return_email;
    var user_domain = data.return_domain;
    var user_name = data.return_username;

    MovieClip(parent).gotoAndPlay("confirm");

    first_txt.text = first_nme;
    second_txt.text = second_nme;
    email_txt.text =  email_addr;
    username_txt.text = user_name;
    domain_txt.text = user_domain;


    }
    else {
        status_txt.text = "Oops, something went wrong. Please try again later.";

    }

}

PARENT:

trace(MovieClip(verif).getChildAt(0).first_nme);
txtt_txt.text = first_nme;

我尝试使用行trace(MovieClip(verif).getChildAt(0).first_nme);中的帧编号,但仍然是相同的错误。

9 个答案:

答案 0 :(得分:2)

将范围first_name尝试为public:

public var first_nme = data.return_first;

答案 1 :(得分:2)

看来你错过了孩子的参考文献
假设您将子项的名称设置为“childname”

childmc.name = "childname"; // to set the name of the child
...
trace(MovieClip(verif).getChildByName("childname").first_nme);

OR

trace(MovieClip(verif).getChildAt(0).first_nme);
trace(MovieClip(verif).getChildAt(1).first_nme);
etc...

答案 2 :(得分:2)

您似乎提前调用了trace,因为您在子mc中异步加载了某些内容。在这里做的正确的事情是加载子mc中的东西,当加载过程完成(onCompleteHandler)时,你触发一个由父mc处理的事件。您还可以将加载的数据添加到(custom-)事件,并使用eventobject将其传递给父级:

function completeHandler(event:Event):void 
{
    // Load the response from the PHP file
    var data:URLVariables = new URLVariables(event.target.data);
    var returnn_stat = data.return_status;
    var ffferror256 = data.return_value;
    returnn_stat = returnn_stat.replace(/\s/m, "");


    if (returnn_stat == "FAILED")
    {
        status_txt.text = ffferror256;
    }
    else if (returnn_stat == "PASSED")
    {
        var evt:MyCustomEvent = new MyCustomEvent(MyCustomEvent.DATA_LOADED, true, true);
        evt.first_name = first_nme;
        evt.second_name = second_nme;
        evt.email =  email_addr;
        evt.username = user_name;
        evt.domain = user_domain;

        dispatchEvent(evt);
    }
    else
    {
        status_txt.text = "Oops, something went wrong. Please try again later.";
    }
}

然后你的父mc中有一个eventlistener:

this.addEventListener(MyCustomEvent.DATA_LOADED, onDataComplete);
// ...
private function onDataComplete(evt:MyCustomEvent):void
{
    gotoAndPlay("confirm");

    first_txt.text = evt.first_name;
    second_txt.text = evt.second_name;
    email_txt.text =  evt.email;
    username_txt.text = evt.username;
    domain_txt.text = evt.domain;
}

以及最后但并非最不重要的自定义事件类:

package 
{
    import flash.events.Event;

    public class MyCustomEvent extends Event
    {
        public static const DATA_LOADED:String = "onDataLoaded";

        public var first_name:String;
        public var second_name:String;
        public var email:String;
        public var username:String;
        public var domain:String;

        public function MyCustomEvent($type:String, $bubbles:Boolean = false, $cancelable:Boolean = false)
        {
            super($type, $bubbles, $cancelable);
        }
    }
}

答案 3 :(得分:2)

请参阅此link

在子mc中将变量定义为public,否则它们将限定为default可见性,即对另一个组件不可见,除非访问和访问的组件都属于同一名称空间

答案 4 :(得分:2)

很少有事情可以想到。

  1. 只是为了确定:我看到你使用MovieClip(父).gotoAndPlay;在父母时间轴的那一部分,儿童movieclip仍然存在于舞台上?否则它将被删除,并且getChildAt()将不会返回它。

  2. 您确定getChildAt(0)返回正确的MovieClip吗?由于形状,图形等也是子项(您可以检查父项的numChildren属性)。

  3. getChildAt()以DisplayObject类型返回结果;这不是一个动态的类。尝试引用任何未知的变量或属性将导致错误。但是,如果将结果类型转换为MovieClip;您可以访问新的变量和属性(因为MovieClip是一个动态类)。请尝试以下方法:

    trace(MovieClip(MovieClip(verif).getChildAt(0)).first_nme);
    
  4. BTW:如果你给了一个实例名称,你也可以用名字来引用它,而不是使用getChildAt()(verif.somename.first_nme)。

答案 5 :(得分:2)

父剪辑无法访问这些变量,除非您将它们声明为公共变量。如果您没有声明属性属性,它将默认为internal,这意味着它只对同一个包中的类可见。当您尝试访问它们时,您不会收到任何警告,因为MovieClip是动态的,但是当您尝试访问它们时,您将收到错误。

如果您发布了全班,会很有帮助。

答案 6 :(得分:1)

您是否为您的孩子mc设置了实例名称?

如果是,请尝试遵循此。

trace(MovieClip(root).child_mc.variable_name);

另一个重要的事情你应该记住,每当你创建子MovieClip时,它将在其父级之后执行,所以如果你直接从父级跟踪变量(子)。它会显示NAN,因为它没有被执行。

这样,从父母那里追踪孩子Mc的变量只需要调用你孩子的一个函数(追踪孩子mc变量的父母)。

您孩子的代码mc

var test:Number = 123;
MovieClip(root).test_var();

根框架中的代码

function test_var()
{
    trace(MovieClip(root).mc_test.test);
}

您需要在功能之前创建变量。

    var first_nme:String;
    var second_nme:String;
    var email_addr:String;
    var user_domain:String;
    var user_name:String;

function completeHandler(event:Event):void{

    // Load the response from the PHP file
    var data:URLVariables = new URLVariables(event.target.data);
    var returnn_stat = data.return_status;
    var ffferror256 = data.return_value;
    returnn_stat = returnn_stat.replace(/\s/m, "");


    if (returnn_stat == "FAILED"){
    status_txt.text = ffferror256;

    }
    else if (returnn_stat == "PASSED"){

    first_nme = data.return_first;
    second_nme = data.return_second;
    email_addr = data.return_email;
    user_domain = data.return_domain;
    user_name = data.return_username;

    MovieClip(parent).gotoAndPlay("confirm");

    first_txt.text = first_nme;
    second_txt.text = second_nme;
    email_txt.text =  email_addr;
    username_txt.text = user_name;
    domain_txt.text = user_domain;


    }
    else {
        status_txt.text = "Oops, something went wrong. Please try again later.";

    }
希望它能帮助........

答案 7 :(得分:0)

您的变量未在正确的范围级别声明。你在一个函数中声明它们,这使得它们对movieclip的父类是不可见的。如果您希望能够从父类访问变量,则必须直接在子类中声明它们,以便在实例化子项时包含它们。

例如:

package
{

   import flash.display.MovieClip;

   public class WHATEVER extends MovieClip
   {
       // declare your variables here
       public var SOMEVAR:String;

       public function WHATEVER():void { }

       private function onComplete(e:Event):void
       {
            SOMEVAR = "Something";

            // this variable will not be visible to parent
            var NEWVAR:String = "I'm invisible";
       }
   }
}

由于该值是在定义时异步填充的,因此您需要在父级中使用它之前测试该值。或者,您可以在设置值时触发事件,并让父级侦听该事件以更新其所需的内容。

答案 8 :(得分:0)

我猜测儿童movieclip正坐在时间轴上,并且当播放头到达父时间轴中的那个帧时,您正试图访问其中的变量。如果情况确实如此,那么问题就出现了,因为你在渲染之前试图访问对象的内容。

尝试将变量访问代码放在函数中,并使用Event.Render事件侦听器调用它。然后,您需要做的就是从时间轴调用stage.invalidate(),并且该变量应该是可访问的。

例如:

在父时间轴上:

this.addEventListener(Event.RENDER, stageRender);

function stageRender(e:Event):void 
{
    //your variables access code goes here
}

stage.invalidate();