如何从外部包中引用Actionscript3中的默认`this`引用?

时间:2011-07-07 17:05:42

标签: flash actionscript-3 flash-cs4

我的代码是外部.as文件。 Google在demo上提供了此代码,其中包含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声明之后,第4次没有发射。

当我应该传递不同的上下文时,我感觉我用new GATracker创建的对象覆盖了整个包。

我认为我应该传递的正确上下文是不在{/ 1}}默认值时不在包/外部文件中,我假设它引用了主阶段对象。

如果我的假设是正确的,我将如何从构造函数内部引用主阶段对象?

2 个答案:

答案 0 :(得分:1)

如果要引用主舞台,则需要等到对象添加到舞台后才能引用它。

它可能看起来像这样:

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事件,并在处理程序中检查阶段的非null值,然后删除处理程序并初始化变量。

答案 1 :(得分:1)

问题是当您尝试初始化跟踪器时,您的类对象不在舞台上。查看GATracker的源代码,您传入的this引用用于从stage loaderInfo对象获取swf url:Line 218

如果您在当前使用this的地方传递的任何displayObject不在舞台上,则此操作将失败:

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

解决方案是:

  1. 正如jeremyne​​albrown建议的那样,为ADDED_TO¬STAGE添加一个监听器,并且只启动你的跟踪器。
  2. 将引用传递给舞台上已有的对象的类,并使用该引用代替this。只要对象在舞台上,您为第一个参数传递的范围就是无关紧要的。