3

我在我的 AngularJS 网络应用程序中使用 Angularytics。它工作正常,但是,我有三个环境(开发、测试和生产),并且它从这两个环境中收集统计数据。我只想显示生产环境的分析。

我分析了许多选项,但它们都有一些问题。现在,我想编辑 angularytics.js 脚本以添加一个条件,因此,它只会在 $rootScope.ENVIRONMENT 常量为 Production 的情况下执行某些操作。

就像是:

(function () {
  angular.module('angularytics', []).provider('Angularytics', function () {
    if($rootScope.ENVIRONMENT == 'Production') {
    var eventHandlersNames = ['Google'];
    this.setEventHandlers = function (handlers) {
      if (angular.isString(handlers)) {
        handlers = [handlers];
      }
      eventHandlersNames = [];
      angular.forEach(handlers, function (handler) {
        eventHandlersNames.push(capitalizeHandler(handler));
      });
    };
    var capitalizeHandler = function (handler) {
      return handler.charAt(0).toUpperCase() + handler.substring(1);
    };
    var pageChangeEvent = '$locationChangeSuccess';
    this.setPageChangeEvent = function (newPageChangeEvent) {
      pageChangeEvent = newPageChangeEvent;
    };
    this.$get = [
      '$injector',
      '$rootScope',
      '$location',
      function ($injector, $rootScope, $location) {
        var eventHandlers = [];
        angular.forEach(eventHandlersNames, function (handler) {
          eventHandlers.push($injector.get('Angularytics' + handler + 'Handler'));
        });
        var forEachHandlerDo = function (action) {
          angular.forEach(eventHandlers, function (handler) {
            action(handler);
          });
        };
        var service = {};
        service.init = function () {
        };
        service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) {
          forEachHandlerDo(function (handler) {
            if (category && action) {
              handler.trackEvent(category, action, opt_label, opt_value, opt_noninteraction);
            }
          });
        };
        service.trackPageView = function (url) {
          forEachHandlerDo(function (handler) {
            if (url) {
              handler.trackPageView(url);
            }
          });
        };
        service.trackTiming = function (category, variable, value, opt_label) {
          forEachHandlerDo(function (handler) {
            if (category && variable && value) {
              handler.trackTiming(category, variable, value, opt_label);
            }
          });
        };
        $rootScope.$on(pageChangeEvent, function () {
          service.trackPageView($location.url());
        });
        return service;
      }
    ];
  }});
}());
(function () {
  angular.module('angularytics').factory('AngularyticsConsoleHandler', [
    '$log',
    function ($log) {
      var service = {};
      service.trackPageView = function (url) {
        $log.log('URL visited', url);
      };
      service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) {
        $log.log('Event tracked', category, action, opt_label, opt_value, opt_noninteraction);
      };
      service.trackTiming = function (category, variable, value, opt_label) {
        $log.log('Timing tracked', category, variable, value, opt_label);
      };
      return service;
    }
  ]);
}());
(function () {
  angular.module('angularytics').factory('AngularyticsGoogleHandler', function () {
    var service = {};
    service.trackPageView = function (url) {
      _gaq.push([
        '_set',
        'page',
        url
      ]);
      _gaq.push([
        '_trackPageview',
        url
      ]);
    };
    service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) {
      _gaq.push([
        '_trackEvent',
        category,
        action,
        opt_label,
        opt_value,
        opt_noninteraction
      ]);
    };
    service.trackTiming = function (category, variable, value, opt_label) {
      _gaq.push([
        '_trackTiming',
        category,
        variable,
        value,
        opt_label
      ]);
    };
    return service;
  }).factory('AngularyticsGoogleUniversalHandler', function () {
    var service = {};
    service.trackPageView = function (url) {
      ga('set', 'page', url);
      ga('send', 'pageview', url);
    };
    service.trackEvent = function (category, action, opt_label, opt_value, opt_noninteraction) {
      ga('send', 'event', category, action, opt_label, opt_value, { 'nonInteraction': opt_noninteraction });
    };
    service.trackTiming = function (category, variable, value, opt_label) {
      ga('send', 'timing', category, variable, value, opt_label);
    };
    return service;
  });
}());
(function () {
  angular.module('angularytics').filter('trackEvent', [
    'Angularytics',
    function (Angularytics) {
      return function (entry, category, action, opt_label, opt_value, opt_noninteraction) {
        Angularytics.trackEvent(category, action, opt_label, opt_value, opt_noninteraction);
        return entry;
      };
    }
  ]);
}());

我知道一点 Angular,但是,我认为我不够熟练,无法在此脚本中注入 $rootScope。我总是得到$rootScope is not defined

更新 关于下面的评论,我更新了帖子:有条件地添加脚本是我的第一种方法。这可以在控制器中完成,例如:

if ($rootScope.ENVIRONMENT == 'Production') {    
            var head = document.getElementsByTagName('head')[0];
            var js = document.createElement("script");    
            js.type = "text/javascript";
            js.src =   "lib/plugins/angularytics-yanpy.js";
            head.appendChild(js);           
        }

这是 angularytics-yanpy:

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-59702007-1', 'auto');

另一方面,您必须将 angularytics 脚本添加到主页:

I think this will work in production environment. However, now in development a got a javascript error. Because angularytics.js needs the ga object created in the angularytics-yanpy.js. As this script is not created because is in development environment a get the javascript error.

我还添加了<script src="lib/plugins/angularytics.js"></script>动态。但是我遇到了一个新错误,因为这个脚本定义了一个在 app.js 文件中定义的 angularytics 提供程序。

因此,错误被链接起来,这就是为什么我尝试更新 angularytics.js 脚本以保留提供者,但如果环境与生产环境不同,它应该什么都不做。

可能我不是很清楚,但也不容易解释。如果您需要更多说明,请告诉我。

4

4 回答 4

13

您不应该在 中设置环境,$rootScope最好使用 grunt-ng-constant 将其设置为常量(参见教程)。

回答你的问题。您可以使用以下方法将 rootScope 注入提供程序:

.provider('Angularytics', function ($rootScope) {});

但是,这不是解决您的整体问题的好方法。

一个好的方法是检测主机名并为以下各项设置单独的Google 分析属性

  • 发展
  • 分期
  • 生产

在您的 html 谷歌分析脚本中添加此 switch 语句。

var gaProp;

switch (window.location.hostname) {
    case 'www.domain.com':
        gaProp = 'UA-123456'; // production
        break;
    case 'staging.domain.com':
        gaProp = 'UA-654321'; // staging
        break;
    default:
        gaProp = 'UA-000000'; // development
}

// Google Analtics
(function (i, s, o, g, r, a, m) {
    i['GoogleAnalyticsObject'] = r;
    i[r] = i[r] || function () {
                (i[r].q = i[r].q || []).push(arguments)
            }, i[r].l = 1 * new Date();
    a = s.createElement(o), m = s.getElementsByTagName(o)[0];
    a.async = 1;
    a.src = g;
    m.parentNode.insertBefore(a, m)
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
ga('create', gaProp, 'auto');

注意我在 ga 事件(最后一行)中设置 gaProp。

这样,您可以为每个属性设置不同的目标和过滤器,并且您的所有测试数据不会相互干扰。

于 2015-05-29T09:41:16.367 回答
0

您可能希望在 Google Analytics(分析)数据视图中设置过滤器。

  1. 点击Add Filter
  2. 给你的过滤器一个名字。
  3. 将过滤器类型设置为Custom
  4. 选择include按钮 将过滤器字段设置为Hostname
  5. 然后像这样设置模式:(www\.yourdomain\.com$当然,如果您不使用“.com”,则使用您实际使用的 TLD)。
  6. 选择您要为其启用此过滤器的配置文件。

这可能是做你想做的最简单的方法。您过滤掉任何不是来自域的数据。

于 2015-05-29T09:24:00.103 回答
0

当您使用 Grunt 构建您的应用程序时,这是我在工作中的一个应用程序中成功实现的一种方法。

我在 Google Analytics 中生成了 2 个跟踪代码,一个用于测试环境,一个用于生产环境。我看到您不打算跟踪您的环境,这也是我最初的计划。但是,最好测试一下关于 Google Analytics 的一切是否正常工作,并且如果您开始跟踪自定义事件(例如有多少用户点击某个按钮等),它也会非常有用。幸运的是,跟踪代码是免费的...

我已经使用Grunt 预处理来有条件地编写适当的代码。

在我的index.html中,我将 GA 代码放在底部,如下所示:

  <script>
     (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  <!-- @if DEV -->
  ga('create', 'UA-554030000-1', 'auto');
  <!-- @endif -->
  <!-- @if PRODUCTION -->
  ga('create', 'UA-554030000-2', 'auto');
  <!-- @endif -->
  </script>  

然后只需配置您的任务:

preprocess : {
  html: 'build/index.html',
  options: {
    inline : true
  }
  production : {
  options: {
   context : {
    PRODUCTION: true
   }
  }
 },
 dev : {
  options: {
    context : {
     DEV: true
   }
 }

然后运行grunt preprocess:production​​orgrunt preprocess:dev将剥离未使用的代码并构建适当的文件。然后可以将此任务包含在您的构建过程中(我使用一个标志grunt build --dev来将脚本引导到正确的路径)。

于 2015-05-29T10:16:53.360 回答
0

它应该像打开开发模式以停止发送跟踪信息一样简单。直接来自文档,它说在您的应用程序配置中执行以下操作。

对于您不希望发送跟踪的两个环境,设置为 true,在推送到生产环境时,只需使用构建脚本将其设置回 false。

$analyticsProvider.developerMode(true);
于 2015-05-29T10:43:17.943 回答