2015-06-16 3 views
2

У меня возникла проблема с передачей значения переменной в родительском скрипте AS3 дочерней swf, вызываемой родителем.Доступ к переменной в родительском скрипте AS3 из дочернего скрипта

У ребенка также есть связанный с ним сценарий 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 Не удается получить доступ к свойству или методу ссылки на нулевой объект.

ответ

0

Использование литой до 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/

+1

Спасибо за ваш ответ. Это работает. Однако я нашел пару ошибок. В основном скрипте в частной функции onComplete var для приемника должен быть var-приемником: StringReceiver = loaderInfo.content как StringReceiver. В последнем StringReceiver было пространство. И в сценарии StringReceiver общественности набор функций Текст (значение: String) { должны быть общественные функции установить текст (значение: String) { набор был в неправильном месте. Но я понятия не имел, как это сделать без вашей помощи. И для этого я действительно хочу поблагодарить вас за ваш быстрый ответ. –

+0

@DavidYoung мой плохой, я должен был упомянуть, что я просто набрал его в браузере, чтобы дать представление о том, как это решение может выглядеть и не проверять его. Спасибо, что указали эти ошибки, я исправил их в своем ответе. Не стесняйтесь напрямую редактировать сообщения в следующий раз. Редактирование сообщений других людей рекомендуется на этом сайте. Добро пожаловать в stackoverflow =) – null

+0

Я не знал, что смогу изменить ваш ответ. Новое на этом сайте. –

Смежные вопросы