получить переменные из дочернего мувиклипа в родительском?Flash AS3 - PullRequest
5 голосов
/ 21 сентября 2011

У меня есть некоторые переменные, определенные в дочернем 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.";

    }

}

РОДИТЕЛЬ:

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

Я пробовал с номером кадра в строке trace(MovieClip(verif).getChildAt(0).first_nme);, но все равно та же ошибка.

Ответы [ 9 ]

2 голосов
/ 28 сентября 2011

Мало что приходит на ум.

  1. Просто чтобы быть уверенным: я вижу, вы используете MovieClip (родительский) .gotoAndPlay;дочерний мувиклип все еще присутствует на сцене в той части временной шкалы в родительском?В противном случае он будет удален, а getChildAt () не вернет его.

  2. Вы уверены, что getChildAt (0) возвращает правильный MovieClip?Поскольку фигуры, графика и т. Д. Также являются дочерними (вы можете проверить свойство numChildren родительского элемента).

  3. getChildAt () возвращает результат в виде типа DisplayObject;который не является динамическим классом.Попытка ссылки на любую неизвестную переменную или свойство приведет к ошибке.Однако, если вы ввели результат в MovieClip;Вы можете получить доступ к новым переменным и свойствам (поскольку MovieClip является динамическим классом).Поэтому попробуйте следующее:

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

Кстати: если вы дали клипу имя экземпляра, вы также можете ссылаться на него по имени вместо использования getChildAt () (verify.somename).first_nme).

2 голосов
/ 28 сентября 2011

Родительский клип не может получить доступ к этим переменным, если вы не объявите их общедоступными. Если вы не объявите атрибут свойства, он по умолчанию будет иметь внутреннее значение, так как он будет виден только классам в одном пакете. Вы не получите никаких предупреждений при попытке доступа к ним, поскольку мувиклипы являются динамическими, однако при попытке доступа к ним вы получите сообщение об ошибке.

Было бы полезно, если бы вы опубликовали весь класс.

2 голосов
/ 24 сентября 2011

См. Эту ссылку

. Определите переменные как public в дочернем mc, в противном случае они будут видны до default, то есть не видны другому компоненту, если обакомпоненты доступа и доступа принадлежат одному пространству имен

2 голосов
/ 24 сентября 2011

кажется, что вы вызываете 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:

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);
        }
    }
}
2 голосов
/ 21 сентября 2011

Кажется, вам не хватает дочерней ссылки
Предполагается, что вы установили имя ребенка как "childname"

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

ИЛИ

trace(MovieClip(verif).getChildAt(0).first_nme);
trace(MovieClip(verif).getChildAt(1).first_nme);
etc...
2 голосов
/ 21 сентября 2011

Попробуйте просмотреть first_nme для публики:

public var first_nme = data.return_first;
1 голос
/ 24 сентября 2011

Вы установили имя экземпляра для своего дочернего mc?

, если да, чем пытаетесь следовать этому.

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

еще одна важная вещь, которую вы должны помнить, что всякий раз, когда вы создаете дочерние MovieClips, это будетбудет выполняться после его родителя, так что если вы отслеживаете переменную (потомка) непосредственно от родителя.он будет отображать NAN так, как если бы он не выполнялся.

, чтобы отследить переменную дочернего Макса от родителя, просто вызвать функцию (родительского объекта, которая отслеживает переменную дочернего Макса) в вашем потомке.

код вашего ребенка 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.";

    }

надеюсь, это поможет ........

0 голосов
/ 30 сентября 2011

Я предполагаю, что дочерний мувиклип находится на временной шкале, и вы пытаетесь получить доступ к переменным внутри него, когда головка воспроизведения достигает этого кадра на родительской временной шкале.Если это действительно так, то проблема возникает из-за того, что вы пытаетесь получить доступ к содержимому объекта до его визуализации.

Попробуйте поместить свой код доступа к переменной внутри функции и вызвать его с помощью Event.Render.слушатель событий.Тогда все, что вам нужно сделать, это сделать вызов stage.invalidate () из временной шкалы, и переменная должна быть доступна.

Например:

На родительской временной шкале:

this.addEventListener(Event.RENDER, stageRender);

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

stage.invalidate();
0 голосов
/ 30 сентября 2011

Ваши переменные не объявлены на нужном уровне области видимости. Вы объявляете их внутри функции, которая делает их невидимыми для родительского класса мувиклипа. Если вы хотите иметь доступ к переменным из родительского класса, вы должны объявить их непосредственно в дочернем классе, чтобы они включались при создании экземпляра дочернего.

Например:

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";
       }
   }
}

Поскольку это значение заполняется асинхронно с момента его определения, вам необходимо проверить значение перед его использованием в родительском элементе. Кроме того, вы можете вызвать событие, когда значение установлено, и попросить родительского прослушивания этого события обновить то, что ему нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...