Как мне ссылаться на стандартную ссылку `this` в Actionscript3 из внешнего пакета? - PullRequest
0 голосов
/ 07 июля 2011

Мой код - внешний файл .as. Google предоставляет этот код в своей демоверсии , которая содержит ключевое слово this:

import com.google.analytics.AnalyticsTracker; 
import com.google.analytics.GATracker; 
var tracker:AnalyticsTracker = new GATracker( this, "UA-111-222", "AS3", true ); 
playGame.addEventListener( MouseEvent.CLICK, onButtonClick ); 
function onButtonClick ( event:Event ):void 
{
   tracker.trackPageview("/myGame1"); 
}

Этот код, вероятно, отлично работает в контексте по умолчанию, но, поскольку я встраиваю этот код во внешний файл .as, в котором я определяю пакет, очевидно, что ссылка this отличается, поскольку контекст выполнения отличается.

В настоящее время у меня вот так:

package {
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.net.URLRequest;
        import flash.net.navigateToURL;
        import flash.text.TextFieldAutoSize;
        import flash.text.TextFormat;
        import flash.external.ExternalInterface;    

        import com.google.analytics.AnalyticsTracker; 
        import com.google.analytics.GATracker; 

        public class DetailView extends MovieClip {

                //private var tracker:GATracker;
                private var tracker:AnalyticsTracker;

                function slugify(text) {
                        text = text.replace(/[^-a-zA-Z0-9,&\s]+/ig, '');
                        text = text.replace(/-/gi, "_");
                        text = text.replace(/\s/gi, "-");
                        return text.toLowerCase();
                }   

                public static var NEXTOFFER:String = "DETAIL_NEXTOFFER";
                public static var TERMS:String = "DETAIL_TERMS";
                private var link:String;
                private var fbshare:String;
                private var twshare:String;
                private var offerID:Number;
                private var details:Sprite;
                private var terms:Sprite;

                public function DetailView() {
                        ExternalInterface.call( "console.log", 'before');
                        ExternalInterface.call( "console.log", typeof GATracker );
                        ExternalInterface.call( "console.log", typeof this );
                        tracker = new GATracker( this, "UA-WATEVER", "AS3", true );  
                        ExternalInterface.call( "console.log", 'after');

Обратите внимание, что у меня 4 звонка на console.log. Первые 3 стреляют, но после оператора new GATracker четвертый не стреляет.

У меня такое чувство, что я перезаписываю весь пакет объектом, созданным из new GATracker, когда мне нужно передать другой контекст.

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

Если мое предположение верно, как бы я ссылался на объект главной сцены изнутри конструктора?

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Проблема в том, что ваш объект класса не находится на сцене, когда вы пытаетесь инициализировать трекер. Глядя на источник для GATracker, ссылка на this, которую вы передаете, используется для получения URL-адреса swf из объекта stage loaderInfo: Строка 218 .

Это не удастся, если какой-либо объект displayObject, который вы передадите туда, где вы в данный момент используете this, не находится на сцене:

//_display contains a reference to the first property from the constructor
_env.url = _display.stage.loaderInfo.url;

Возможны следующие решения:

  1. , как предлагает jeremynealbrown, добавить слушателя для ADDED_TO¬STAGE и запускать трекер только в этот момент.
  2. передать ссылку в класс объекта, который уже находится на сцене, и использовать эту ссылку вместо this. Область, которую вы передаете для этого первого параметра, не имеет значения, пока объект находится на сцене.
1 голос
/ 07 июля 2011

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

Это может выглядеть примерно так:

public function DetailView()
{
     addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
}

protected function onAddedToStage( event:Event ):void 
{
     tracker = new GATracker( this, "UA-WATEVER", "AS3", true );  
     removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
}

Другой подход к этому - прослушивание события ENTER_FRAME и проверка в обработчике ненулевого значения для сцены, затем удалениеобработчик и инициализация ваших переменных.

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