AngularJS로 Google 웹 로그 분석 페이지 조회수 추적


221

AngularJS를 프론트 엔드로 사용하여 새 앱을 설정하고 있습니다. 클라이언트 측의 모든 것은 HTML5 푸시 상태로 수행되며 Google 애널리틱스에서 내 페이지 조회수를 추적하고 싶습니다.


angulartics를보십시오. luisfarzati.github.io/angulartics
David

2
각도는 더 이상 사용되지 않습니다. 사용 각도 - 구글 - 분석
webdev5

5
@ webdev5 새로운 버전의 각도가 나옵니다. angulartics.github.io
Devner

답변:


240

ng-viewAngular 앱에서 사용중인 경우 $viewContentLoaded이벤트를 수신 하고 추적 이벤트를 Google 웹 로그 분석으로 푸시 할 수 있습니다 .

이름이 var _gaqMyCtrl 인 기본 index.html 파일에 추적 코드를 설정했다고 가정하면 ng-controller지시문 에서 정의한 것입니다 .

function MyCtrl($scope, $location, $window) {
  $scope.$on('$viewContentLoaded', function(event) {
    $window._gaq.push(['_trackPageView', $location.url()]);
  });
}

업데이트 : 새로운 버전의 google-analytics는이 버전을 사용하십시오.

function MyCtrl($scope, $location, $window) {
  $scope.$on('$viewContentLoaded', function(event) {
    $window.ga('send', 'pageview', { page: $location.url() });
  });
}

12
그러나 그것은해서는 _trackPageview안됩니다 _trackPageView... 10 분 동안 머리를 긁적 :)
sajal

123
내가 사용할 것 $rootScope.$on('$routeChangeSuccess', ...)
bearfriend

5
@DavidRivers 흠, 그것은 시간이 지났지 만,이 답변과 내 의견을 보았을 때, $rootScope다른 이벤트 나 DOM 변경으로 제거되지 않을 routeChangeSuccess때마다 적용하면 매번 실행됩니다. 보기 소스 템플릿을 변경하는 대신 위치 표시 줄이 변경됩니다. 말이 돼?
bearfriend

5
$ routeChangeSuccess 이벤트 중에 @ dg988을 사용하면 페이지 제목을 미리 알 수 없습니다 (예 : RESTful 서비스에서 데이터 처리를 완료 한 후 컨트롤러 내부에서 설정할 수 있음). Google 웹 로그 분석은 페이지 URL을 사용하여 이전 페이지의 제목을 추적합니다.
콘스탄틴 타르 쿠스

43
GA 새 스크립트를 사용하는 $window.ga('send', 'pageview', { page: $location.path() });경우 $window._gaq...일부가 아닙니다 . 또한 ga('send', 'pageview');페이지에 처음 방문 할 때 중복이 발생하지 않도록 원래 GA 코드에서 삭제 하는 것이 좋습니다.
CWSpear

57

에 새보기가로드 AngularJS되면 Google 웹 로그 분석은 새 페이지로드로 계산하지 않습니다. 다행히도 GA에 URL을 새 페이지 뷰로 기록하도록 수동으로 지시하는 방법이 있습니다.

_gaq.push(['_trackPageview', '<url>']); 작업을 수행하지만 AngularJS와 바인딩하는 방법은 무엇입니까?

사용할 수있는 서비스는 다음과 같습니다.

(function(angular) { 

  angular.module('analytics', ['ng']).service('analytics', [
    '$rootScope', '$window', '$location', function($rootScope, $window, $location) {
      var track = function() {
        $window._gaq.push(['_trackPageview', $location.path()]);
      };
      $rootScope.$on('$viewContentLoaded', track);
    }
  ]);

}(window.angular));

각도 모듈을 정의 할 때 다음과 같이 분석 모듈을 포함하십시오.

angular.module('myappname', ['analytics']);

업데이트 :

다음과 함께 새로운 범용 Google 웹 로그 분석 추적 코드를 사용해야합니다.

$window.ga('send', 'pageview', {page: $location.url()});

6
여기서 주목할 점은 어딘가에 "분석"서비스를 포함시켜야한다는 것입니다. app.run에서 내 작업을 수행했습니다.
Nix

모든 모듈 또는 초기 앱에만 포함해야합니까?
designermonkey

2
@Designermonkey 기본 앱 모듈에만 포함하면 작동합니다. 메인 모듈을 필요로하지 않는 완전히 독립적 인 모듈이 있다면 다시 포함시켜야 할 수도 있습니다. 건배!
Haralan Dobrev

서비스를 사용하는 경우 "this"키워드를 사용하여 함수를 정의해야합니다 : source . 예를 들어, 서비스 내에서 this.track = function($window.ga('send', 'pageview', {page: $location.url()});이렇게하면 app.run () 함수 googleAnalytics.track();내 에서 사용할 수 있습니다
zcoon

48
app.run(function ($rootScope, $location) {
    $rootScope.$on('$routeChangeSuccess', function(){
        ga('send', 'pageview', $location.path());
    });
});

8
참고 : 최소화 / 컴파일을 사용하는 경우 매개 변수 이름을 지정해야합니다.app.run(["$rootScope", "$location", function(...
dplass

이 솔루션은 모든 컨트롤러에 GA 코드를 포함하지 않으려는 경우에 탁월합니다.
breez December

1
제목을 동적으로 변경하는 비동기 코드가 있으면 좋지 않습니다.
요한

40

빠른 추가. 새로운 analytics.js를 사용중인 경우 다음을 수행하십시오.

var track = function() {     
 ga('send', 'pageview', {'page': $location.path()});                
};

또한 한 가지 팁은 Google 웹 로그 분석이 localhost에서 실행되지 않는다는 것입니다. 따라서 localhost에서 테스트하는 경우 기본 작성 ( 전체 문서 ) 대신 다음을 사용하십시오.

ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});

오, 고마워 이상한 오류가 발생하여 내 발췌 문장에 _gaq가없는 것을 알았습니다. 바보 구글 : 그들의 코드와 모든 것을 업데이트! ㅋ.
CWSpear

3
$window창에 액세스하는 데 사용하십시오 ( gaAngular 내부에서만 가능 undefined). 또한 ga('send', 'pageview');페이지에 처음 방문 할 때 중복이 발생하지 않도록 원래 GA 코드에서 삭제 하는 것이 좋습니다.
CWSpear

6
ui-router를 사용하면 다음과 같은 페이지 뷰를 보낼 수 있습니다.$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { ga('send', 'pageview', { 'page': $location.path(), 'title': toState.name }); });
pherris

2
추가하기 : 앱에서 검색 매개 변수를 사용하는 경우$location.url()
Ade

2
일반적으로 쿼리 문자열 매개 변수를 제외하려고하기 때문에 .path () 사용하는 것이 .url ()보다 낫기 때문에이 답변을 찬성했습니다. 참조 : Google 웹 로그 분석 구성 실수 # 2 : 쿼리 문자열 변수
frodo2975

11

나는 당신을 도울 수있는 서비스 + 필터를 만들었으며, 나중에 추가하도록 선택하면 다른 공급자와 함께 할 수도 있습니다.

https://github.com/mgonto/angularytics를 확인하고 이것이 어떻게 작동하는지 알려주세요.


10

wynnwu와 dpineda의 답변을 병합하는 것이 저에게 효과적이었습니다.

angular.module('app', [])
  .run(['$rootScope', '$location', '$window',
    function($rootScope, $location, $window) {
      $rootScope.$on('$routeChangeSuccess',
        function(event) {
          if (!$window.ga) {
            return;
          }
          $window.ga('send', 'pageview', {
            page: $location.path()
          });
        });
    }
  ]);

세 번째 매개 변수를 $ location.path () 대신 객체로 설정하고 $ stateChangeSuccess 대신 $ routeChangeSuccess를 사용하여 트릭을 수행했습니다.

도움이 되었기를 바랍니다.


7

위의 접근 방식을 사용하여 github에 대한 간단한 예를 만들었습니다.

https://github.com/isamuelson/angularjs-googleanalytics


경로를 더 잘보고 할 수 있도록 수정 프로그램을 추가했습니다. 따라서 이제 /account/:accountId 경로 경로가 http://somesite.com/account/123있다면 경로를 다음과 같이보고합니다./account?accountId=123
IBootstrap

@IBootstrap 라우트 매개 변수를 쿼리 문자열에 넣는 이점은 무엇입니까?
Pavel Nikolov

@IBootstrap 같은 질문이 있는데 쿼리 문자열에 경로 매개 변수를 넣는 이점은 무엇입니까?
Dzung Nguyen

1
모든 경로가 다른 페이지 인 것은 아니며 GA가 각 경로를 다른 페이지로 취급합니다. 경로를 쿼리 문자열로 변환하면 쿼리 문자열의 일부를 무시할 수 있습니다.
IBootstrap 5

5

이를 수행하는 가장 좋은 방법은 Google 태그 관리자를 사용하여 기록 리스너를 기반으로 Google 웹 로그 분석 태그를 실행하는 것입니다. 이것들은 GTM 인터페이스에 내장되어 있으며 클라이언트 측 HTML5 상호 작용을 쉽게 추적 할 수 있습니다.

내장 된 내역 변수를 활성화하고 내역 변경을 기반으로 이벤트를 발생시키는 트리거를 만듭니다.


5

에서 index.html코드 조각을 복사하여 붙여 넣으십시오.ga('send', 'pageview');

<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<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');
  ga('create', 'UA-XXXXXXXX-X');
</script>

my-google-analytics.js자체 주입이있는 자체 공장 파일 입니다.

angular.module('myApp')
  .factory('myGoogleAnalytics', [
    '$rootScope', '$window', '$location', 
    function ($rootScope, $window, $location) {

      var myGoogleAnalytics = {};

      /**
       * Set the page to the current location path
       * and then send a pageview to log path change.
       */
      myGoogleAnalytics.sendPageview = function() {
        if ($window.ga) {
          $window.ga('set', 'page', $location.path());
          $window.ga('send', 'pageview');
        }
      }

      // subscribe to events
      $rootScope.$on('$viewContentLoaded', myGoogleAnalytics.sendPageview);

      return myGoogleAnalytics;
    }
  ])
  .run([
    'myGoogleAnalytics', 
    function(myGoogleAnalytics) {
        // inject self
    }
  ]);

나는 그 자체 주입 물건을 좋아한다 :) 위로
샘 Vloeberghs

호기심을 피하기 위해 왜 page현재 경로 를 설정하고 pageview? 로 제출 합니까? 그냥 대신 그렇게하는 것의 차이점은 무엇입니까 $window.ga('send', 'pageview', {page: $location.url()});?
Fizzix

1
TBH를 기억할 수는 없지만 TBH를 보면 다른 작업에 유연성을 부여하거나 다른 곳에서 추가 항목을 기록한다고 말하고 ga에 현재 페이지를 명시 적으로 알려 주면 더 정확할 수 있으므로 ga가 계속 정확하게 기능하지 않고 정확하게 기능 할 수 있습니다 "임의"페이지 URL에 대한 페이지 뷰를 기록하는 중입니다.
ilovett

실시간 분석이 Google에서 작동하게하려면 "설정"을 수행해야합니다. 왜 문서 참조를 참조하십시오 : developers.google.com/analytics/devguides/collection/…
fuzzysearch

동일한 페이지에서 전송되는 모든 단일 조회수 (예 : 사용자 상호 작용을 추적하기위한 GA 이벤트)가 동일한 페이지 경로 값으로 전송되도록 'set'을 권장합니다. 실시간 분석과 관련이 없습니다. developers.google.com/analytics/devguides/collection/…
SEO SEO

5

gtag()함수 대신 함수가 작동 한다는 것을 알았습니다 ga().

index.html 파일의 <head>섹션 내에서 :

<script async src="https://www.googletagmanager.com/gtag/js?id=TrackingId"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'TrackingId');
</script>

AngularJS 코드에서 :

app.run(function ($rootScope, $location) {
  $rootScope.$on('$routeChangeSuccess', function() {
    gtag('config', 'TrackingId', {'page_path': $location.path()});
  });
});

TrackingId자신의 추적 ID로 교체하십시오 .


4

누군가 지시문을 사용하여 구현하려는 경우 index.html에서 body 태그 바로 아래 또는 동일한 DOM 수준에서 div를 식별하거나 만듭니다.

<div class="google-analytics"/>

지시문에 다음 코드를 추가하십시오.

myApp.directive('googleAnalytics', function ( $location, $window ) {
  return {
    scope: true,
    link: function (scope) {
      scope.$on( '$routeChangeSuccess', function () {
        $window._gaq.push(['_trackPageview', $location.path()]);
      });
    }
  };
});

3

ui-router를 사용하는 경우 다음과 같이 $ stateChangeSuccess 이벤트를 구독 할 수 있습니다.

$rootScope.$on('$stateChangeSuccess', function (event) {
    $window.ga('send', 'pageview', $location.path());
});

완전한 작업 예제는 이 블로그 게시물을 참조하십시오.


3

Google 실시간 분석을 위해 경로를 선택하려면 GA 'set'을 사용하십시오. 그렇지 않으면 이후의 GA 호출은 실시간 패널에 표시되지 않습니다.

$scope.$on('$routeChangeSuccess', function() {
    $window.ga('set', 'page', $location.url());
    $window.ga('send', 'pageview');
});

Google은 일반적으로 '보내기'에서 3 번째 매개 변수를 전달하는 대신이 방법을 강력히 권장합니다. https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications


3

ngRoute 대신 AngularUI 라우터를 사용하는 사용자에게는 다음 코드를 사용하여 페이지보기를 추적 할 수 있습니다.

app.run(function ($rootScope) {
    $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
        ga('set', 'page', toState.url);
        ga('send', 'pageview');
    });
});


3

html5 모드에서 AngluarJS를 사용하고 있습니다. 가장 신뢰할 수있는 솔루션으로 다음을 발견했습니다.

angular-google-analytics 라이브러리를 사용하십시오 . 다음과 같이 초기화하십시오.

//Do this in module that is always initialized on your webapp    
angular.module('core').config(["AnalyticsProvider",
  function (AnalyticsProvider) {
    AnalyticsProvider.setAccount(YOUR_GOOGLE_ANALYTICS_TRACKING_CODE);

    //Ignoring first page load because of HTML5 route mode to ensure that page view is called only when you explicitly call for pageview event
    AnalyticsProvider.ignoreFirstPageLoad(true);
  }
]);

그런 다음 $ stateChangeSuccess '에 리스너를 추가하고 trackPage 이벤트를 보냅니다.

angular.module('core').run(['$rootScope', '$location', 'Analytics', 
    function($rootScope, $location, Analytics) {
        $rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams, options) {
            try {
                Analytics.trackPage($location.url());
            }
            catch(err) {
              //user browser is disabling tracking
            }
        });
    }
]);

언제든지 사용자를 활성화하면 여기에 Analytics를 주입하고 전화를 걸 수 있습니다.

Analytics.set('&uid', user.id);

2

ui-router를 사용하고 있으며 코드는 다음과 같습니다.

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams){
  /* Google analytics */
  var path = toState.url;
  for(var i in toParams){
    path = path.replace(':' + i, toParams[i]);
  }
  /* global ga */
  ga('send', 'pageview', path);
});

이 방법으로 다른 상태를 추적 할 수 있습니다. 누군가가 유용하다고 생각할 수도 있습니다.


1

개인적으로 현재 경로 대신 템플릿 URL을 사용하여 분석을 설정하고 싶습니다. 이 내 응용 프로그램과 같은 많은 사용자 정의 경로가 주로 때문입니다 message/:id또는 profile/:id. 이러한 경로를 보내려면 웹 로그 분석에 너무 많은 페이지가 표시되므로 가장 많이 방문하는 페이지를 확인하기가 너무 어려울 것입니다.

$rootScope.$on('$viewContentLoaded', function(event) {
    $window.ga('send', 'pageview', {
        page: $route.current.templateUrl.replace("views", "")
    });
});

지금과 같은 내 분석에서 청소 페이지 뷰 수 user-profile.htmlmessage.html대신있는 많은 페이지를 profile/1, profile/2그리고profile/3 . 이제 보고서를 처리하여 얼마나 많은 사용자가 사용자 프로필을보고 있는지 확인할 수 있습니다.

왜 이것이 분석 내에서 이것이 나쁜 습관인지에 반대하는 의견이 있다면, 나는 그것에 대해 기뻐할 것입니다. Google 웹 로그 분석 사용에 익숙하지 않으므로 이것이 최선의 접근인지 아닌지 확실하지 않습니다.


1

세그먼트 분석 라이브러리를 사용하고 Angular 빠른 시작 안내서를 따르는 것이 좋습니다 . 단일 API로 페이지 방문을 추적하고 사용자 행동을 추적 할 수 있습니다. SPA가있는 경우 RouterOutlet페이지가 렌더링 될 때 구성 요소가 처리 ngOnInit하고 호출을 호출 하는 데 사용할 수 page있습니다. 아래 예제는이를 수행 할 수있는 한 가지 방법을 보여줍니다.

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
  ngOnInit() {
    window.analytics.page('Home');
  }
}

https://github.com/segmentio/analytics-angular 의 관리자입니다 . 세그먼트를 사용하면 추가 코드를 작성하지 않고도 여러 분석 도구 (250 개 이상의 대상을 지원함)를 사용하려는 경우 스위치를 사용하여 여러 대상을 켜거나 끌 수 있습니다. 🙂


0

페드로 로페즈의 대답으로 훨씬 더 합병

나는 이것을 ngGoogleAnalytis 모듈 (많은 앱에서 재사용)에 추가했다.

var base = $('base').attr('href').replace(/\/$/, "");

이 경우 색인 링크에 태그가 있습니다.

  <base href="/store/">

angular.js v1.3에서 html5 모드를 사용할 때 유용합니다

(기본 태그가 슬래시로 끝나지 않으면 replace () 함수 호출을 제거하십시오.)

angular.module("ngGoogleAnalytics", []).run(['$rootScope', '$location', '$window',
    function($rootScope, $location, $window) {
      $rootScope.$on('$routeChangeSuccess',
        function(event) {
          if (!$window.ga) { return; }
          var base = $('base').attr('href').replace(/\/$/, "");

          $window.ga('send', 'pageview', {
            page: base + $location.path()
          });
        }
      );
    }
  ]);

-3

Google 웹 로그 분석의 새로운 추적 코드를 완전히 제어하려면 고유 한 Angular-GA를 사용할 수 있습니다 .

그것은 수 ga그래서 시험에 쉽게 주입을 통해 가능합니다. 모든 routeChange에서 경로를 설정하는 것 외에는 마법을 사용하지 않습니다. 여전히 여기처럼 페이지 뷰를 보내야합니다.

app.run(function ($rootScope, $location, ga) {
    $rootScope.$on('$routeChangeSuccess', function(){
        ga('send', 'pageview');
    });
});

또한 다음 ga과 같이 여러 분석 기능을 이벤트에 바인딩 할 수 있는 지시문 이 있습니다.

<a href="#" ga="[['set', 'metric1', 10], ['send', 'event', 'player', 'play', video.id]]"></a>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.