3

AngularJS Web アプリで Angularytics を使用しています。正常に動作していますが、3 つの環境 (開発、テスト、および運用) があり、両方から統計を収集しています。本番環境のみの分析を表示したいと思います。

多くのオプションを分析しましたが、すべてに問題があります。ここで、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

0

追跡情報の送信を停止するには、開発モードをオンにするのと同じくらい簡単なはずです。ドキュメントから直接、アプリの構成で次のことを行うように指示されています。

追跡を送信したくない 2 つの環境については、true に設定し、本番環境にプッシュするときは、ビルド スクリプトを使用して false に戻します。

$analyticsProvider.developerMode(true);
于 2015-05-29T10:43:17.943 に答える
0

おそらく、Google アナリティクスのデータ ビューでフィルタを設定する必要があります。

  1. をクリックしAdd Filterます。
  2. フィルターに名前を付けます。
  3. フィルタ タイプを に設定しますCustom
  4. include[フィルター フィールドを次の値に設定] ボタンを選択しますHostname
  5. 次に、次のようにパターンを設定しますwww\.yourdomain\.com$(もちろん、「.com」を使用しない場合は、実際に使用する TLD を使用します)。
  6. このフィルタを有効にするプロファイルを選択します。

これはおそらく、やりたいことを行う最も簡単な方法です。ドメイン以外のデータを除外します。

于 2015-05-29T09:24:00.103 に答える
0

Grunt を使用してアプリを構築しているので、職場のアプリの 1 つにうまく実装した方法を次に示します。

Google アナリティクスで 2 つのトラッキング コードを生成しました。1 つはテスト環境用、もう 1 つは本番環境用です。あなたは自分の環境を追跡するつもりはないようですが、それは私の最初の計画でもありました。ただし、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:productionorgrunt preprocess:devを実行すると、未使用のコードが取り除かれ、適切なファイルがビルドされます。その後、このタスクをビルド プロセスに含めることができます (grunt build --devスクリプトを正しいパスに誘導するために、フラグのようなものを使用します)。

于 2015-05-29T10:16:53.360 に答える