Theo dõi lượt xem trang Google Analytics bằng AngularJS


221

Tôi đang thiết lập một ứng dụng mới bằng cách sử dụng AngularJS làm giao diện. Mọi thứ về phía khách hàng đều được thực hiện với HTML5 Pushstate và tôi muốn có thể theo dõi lượt xem trang của mình trong Google Analytics.


Hãy thử angulartics luisfarzati.github.io/angulartics
David

2
angulartics bị phản đối. Sử dụng phân tích góc-google
webdev5

5
@ webdev5 Một phiên bản mới của angulartics đã ra mắt. Dùng thử tại: angulartics.github.io
Devner

Câu trả lời:


240

Nếu bạn đang sử dụng ng-viewtrong ứng dụng Angular của mình, bạn có thể lắng nghe $viewContentLoadedsự kiện và đẩy sự kiện theo dõi lên Google Analytics.

Giả sử bạn đã thiết lập mã theo dõi trong tệp index.html chính của mình với tên var _gaqvà MyCtrl là những gì bạn đã xác định trong ng-controllerchỉ thị.

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

CẬP NHẬT: đối với phiên bản mới của Google-Analytics, hãy sử dụng phiên bản này

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

12
FWIW nên _trackPageviewvà không _trackPageView... dành 10 phút gãi đầu :)
sajal

123
Tôi sẽ sử dụng $rootScope.$on('$routeChangeSuccess', ...)
gái

5
@DavidRivers Hừm, đã lâu rồi, nhưng chỉ cần liếc qua câu trả lời này và nhận xét của tôi, có vẻ như việc áp dụng nó để $rootScopeđảm bảo rằng nó sẽ không bị xóa bởi một số sự kiện hoặc thay đổi DOM khác và sử dụng routeChangeSuccesssẽ kích hoạt mỗi khi thay đổi thanh vị trí, thay vì chỉ bao giờ bạn thay đổi mẫu nguồn xem. Điều đó có ý nghĩa?
kết bạn

5
@ dg988 trong sự kiện $ routeChangeSuccess, bạn có thể KHÔNG biết trả trước tiêu đề của trang (ví dụ: có thể được đặt bên trong bộ điều khiển sau khi xử lý xong dữ liệu từ dịch vụ RESTful). Cách này một mình với URL của trang Google Analytics sẽ theo dõi tiêu đề của trang trước đó.
Konstantin Tarkus

43
Nếu bạn đang sử dụng tập lệnh mới GA, thì nó $window.ga('send', 'pageview', { page: $location.path() });thay vì $window._gaq...một phần. Ngoài ra, bạn có thể muốn xóa ga('send', 'pageview');khỏi mã GA gốc của mình để tránh trùng lặp khi lần đầu tiên đặt chân lên một trang.
CWSpear

57

Khi chế độ xem mới được tải vào AngularJS, Google Analytics sẽ không tính nó là tải trang mới. May mắn thay, có một cách để yêu cầu GA ghi nhật ký url dưới dạng một lần xem trang mới.

_gaq.push(['_trackPageview', '<url>']); sẽ thực hiện công việc, nhưng làm thế nào để liên kết điều đó với AngularJS?

Đây là một dịch vụ mà bạn có thể sử dụng:

(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));

Khi bạn xác định mô-đun góc của mình, hãy bao gồm mô-đun phân tích như sau:

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

CẬP NHẬT :

Bạn nên sử dụng mã theo dõi Google Analytics phổ quát mới với:

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

6
Một điều khác cần lưu ý ở đây là bạn cần bao gồm dịch vụ "phân tích" ở đâu đó. Tôi đã làm của tôi trong app.run.
Nix

Điều này sẽ cần bao gồm trong mọi mô-đun, hoặc chỉ ứng dụng ban đầu?
designermonkey

2
@Designermonkey Nó sẽ hoạt động nếu bạn chỉ bao gồm trong mô-đun ứng dụng chính của mình. Nếu bạn có một mô-đun hoàn toàn độc lập mặc dù không yêu cầu mô-đun chính của bạn, bạn có thể cần phải đưa lại mô-đun đó. Chúc mừng!
Haralan Dobrev

Nếu bạn đang sử dụng một dịch vụ, bạn nên xác định các chức năng của mình bằng từ khóa "this": source . Ví dụ, trong dịch vụ nó sẽ là this.track = function($window.ga('send', 'pageview', {page: $location.url()});này sẽ cho phép bạn sử dụng googleAnalytics.track();trong phạm vi của bạn app.run () chức năng
zcoon

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

8
Lưu ý: Nếu bạn sử dụng thu nhỏ / biên dịch, bạn cần chỉ định tên tham số:app.run(["$rootScope", "$location", function(...
dplass

Giải pháp này rất tuyệt vời nếu bạn không muốn bao gồm mã GA trong mọi bộ điều khiển.
breez

1
Không tuyệt vời lắm nếu bạn có mã async tự động thay đổi tiêu đề của bạn, khác với nó là tuyệt vời.
Johan

40

Chỉ là một bổ sung nhanh chóng. Nếu bạn đang sử dụng phân tích mới, thì:

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

Ngoài ra, một mẹo là Google Analytics sẽ không kích hoạt localhost. Vì vậy, nếu bạn đang thử nghiệm trên localhost, hãy sử dụng cách sau thay vì tạo mặc định ( tài liệu đầy đủ )

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

Người đàn ông, cảm ơn. Tôi đã nhận được những lỗi kỳ lạ và nhận thấy đoạn trích của tôi thậm chí không có _gaq trong đó, hehe. Google ngớ ngẩn: cập nhật mã của họ và tất cả những thứ đó! Haha.
CWSpear

3
Hãy chắc chắn rằng bạn sử dụng $windowđể truy cập vào cửa sổ ( garất có thể bên trong Angular rất có thể undefined). Ngoài ra, bạn có thể muốn xóa ga('send', 'pageview');khỏi mã GA gốc của mình để tránh trùng lặp khi lần đầu tiên đặt chân lên một trang.
CWSpear

6
Sử dụng ui-router, bạn có thể gửi lượt xem trang như thế này:$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { ga('send', 'pageview', { 'page': $location.path(), 'title': toState.name }); });
pherris

2
Để thêm: Nếu bạn đang sử dụng các tham số tìm kiếm trong ứng dụng của mình, bạn có thể theo dõi những thông số đó bằng cách sử dụng$location.url()
Ade

2
Tôi đã đưa ra câu trả lời này vì sử dụng .path () tốt hơn .url () vì bạn thường muốn loại trừ các tham số chuỗi truy vấn. Xem: Lỗi cấu hình Google Analytics # 2: Biến chuỗi truy vấn
frodo2975 6/2/2015

11

Tôi đã tạo một bộ lọc dịch vụ + có thể giúp các bạn với điều này và cũng có thể với một số nhà cung cấp khác nếu bạn chọn thêm chúng trong tương lai.

Hãy xem https://github.com/mgonto/angularytics và cho tôi biết cách thức này phù hợp với bạn.


10

Hợp nhất các câu trả lời của wynnwu và dpineda là những gì làm việc cho tôi.

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()
          });
        });
    }
  ]);

Đặt tham số thứ ba làm đối tượng (thay vì chỉ $ location.path ()) và sử dụng $ routeChangeSuccess thay vì $ stateChangeSuccess đã thực hiện thủ thuật này.

Hi vọng điêu nay co ich.


7

Tôi đã tạo một ví dụ đơn giản trên github bằng cách sử dụng phương pháp trên.

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


Tôi đã thêm một sửa chữa để báo cáo đường dẫn tốt hơn. vì vậy bây giờ nếu bạn có lộ trình của /account/:accountId đường dẫn aka http://somesite.com/account/123thì bây giờ nó sẽ báo cáo đường dẫn là/account?accountId=123
IBootstrap

@IBootstrap lợi ích của việc đặt tham số tuyến đường trong chuỗi truy vấn là gì?
Pavel Nikolov

@IBootstrap Tôi có cùng một câu hỏi, lợi ích của việc đặt tham số tuyến đường trong chuỗi truy vấn là gì?
Dzung Nguyễn

1
Không phải tất cả các tuyến là các trang khác nhau và GA coi mỗi tuyến là trang khác nhau. Bằng cách chuyển đổi tuyến đường thành chuỗi truy vấn, bạn có tùy chọn bỏ qua các phần của chuỗi truy vấn.
IBootstrap

5

Cách tốt nhất để làm điều này là sử dụng Trình quản lý thẻ của Google để kích hoạt các thẻ Google Analytics của bạn dựa trên các trình nghe lịch sử. Chúng được tích hợp vào giao diện GTM và dễ dàng cho phép theo dõi các tương tác HTML5 của máy khách.

Kích hoạt các biến Lịch sử tích hợp và tạo một trình kích hoạt để khởi động một sự kiện dựa trên các thay đổi lịch sử.


5

Trong của bạn index.html, sao chép và dán đoạn mã ga nhưng xóa dòngga('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>

Tôi muốn cung cấp cho nó tập tin nhà máy riêng của mình my-google-analytics.jsvới tự tiêm:

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
    }
  ]);

Tôi thích những thứ tự sướng đó :) Up
Sam Vloeberghs

Vì tò mò, tại sao bạn lại đặt pageđường dẫn hiện tại và sau đó gửi nó dưới dạng pageview? Sự khác biệt của việc làm theo cách đó thay vì chỉ là $window.ga('send', 'pageview', {page: $location.url()});gì?
Fizzix

1
Tôi không thể nhớ TBH nhưng bằng cách nhìn vào nó, tôi sẽ nói rằng nó linh hoạt cho các hành động khác hoặc ghi nhật ký bổ sung ở nơi khác và có thể chính xác hơn bằng cách nói rõ ràng ga của trang hiện tại, vì vậy ga có thể tiếp tục hoạt động chính xác, thay vì CHỈ ghi lại số lần xem trang cho một số url trang "tùy ý".
ilovett

Nếu bạn muốn phân tích thời gian thực hoạt động trong Google, bạn nên thực hiện "đặt". Để biết lý do tại sao hãy xem tài liệu tham khảo: developers.google.com/analytics/devguides/collection/,
fuzzysearch

'set' được khuyến nghị để mọi lần truy cập được gửi trên cùng một trang (như Sự kiện GA để theo dõi tương tác của người dùng) được gửi với cùng giá trị đường dẫn Trang. Không có gì để làm với phân tích thời gian thực. xem nhà phát
Mở SEO

5

Tôi tìm thấy gtag()chức năng làm việc, thay vì ga()chức năng.

Trong tệp index.html, trong <head>phần:

<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>

Trong mã AngularJS:

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

Thay thế TrackingIdbằng Id theo dõi của riêng bạn.


4

Nếu ai đó muốn thực hiện bằng cách sử dụng các lệnh sau đó, hãy xác định (hoặc tạo) một div trong index.html (ngay dưới thẻ body hoặc ở cùng cấp DOM)

<div class="google-analytics"/>

và sau đó thêm đoạn mã sau vào lệnh

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

3

Nếu bạn đang sử dụng bộ định tuyến ui, bạn có thể đăng ký sự kiện $ stateChangeSuccess như thế này:

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

Đối với một ví dụ làm việc hoàn chỉnh, xem bài đăng trên blog này


3

Sử dụng GA 'set' để đảm bảo các tuyến được chọn cho các phân tích thời gian thực của Google. Nếu không, các cuộc gọi tiếp theo đến GA sẽ không hiển thị trong bảng thời gian thực.

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

Google đặc biệt khuyên cách tiếp cận này nói chung thay vì vượt qua thông số thứ 3 trong 'gửi'. https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-appluggest


3

Đối với những bạn sử dụng AngularUI Router thay vì ngRoute có thể sử dụng đoạn mã sau để theo dõi lượt xem trang.

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

3

Các nhà phát triển tạo Ứng dụng Trang đơn có thể sử dụng autotrack , bao gồm plugin urlChangeTracker xử lý tất cả các cân nhắc quan trọng được liệt kê trong hướng dẫn này cho bạn. Xem tài liệu autotrack để biết hướng dẫn sử dụng và cài đặt.


3

Tôi đang sử dụng AngluarJS ở chế độ html5. Tôi tìm thấy giải pháp sau đây là đáng tin cậy nhất:

Sử dụng thư viện phân tích góc-google . Khởi tạo nó với một cái gì đó như:

//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);
  }
]);

Sau đó, thêm trình nghe trên $ stateChangeSuccess 'và gửi sự kiện 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
            }
        });
    }
]);

Bất cứ lúc nào, khi người dùng của bạn bị vô hiệu hóa, bạn có thể tiêm Analytics ở đó và thực hiện cuộc gọi:

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

2

Tôi đang sử dụng ui-router và mã của tôi trông như thế này:

$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);
});

Bằng cách này tôi có thể theo dõi các trạng thái khác nhau. Có lẽ ai đó sẽ tìm thấy nó hữu ích.


1

Cá nhân tôi muốn thiết lập phân tích của mình với URL mẫu thay vì đường dẫn hiện tại. Điều này chủ yếu là do ứng dụng của tôi có nhiều đường dẫn tùy chỉnh như message/:idhoặc profile/:id. Nếu tôi gửi những đường dẫn này, tôi sẽ có rất nhiều trang được xem trong phân tích, sẽ rất khó để kiểm tra xem người dùng trang nào đang truy cập nhiều nhất.

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

Bây giờ tôi có được lượt xem trang sạch trong các phân tích của mình, chẳng hạn như user-profile.htmlmessage.htmlthay vì nhiều trang đang profile/1, profile/2profile/3. Bây giờ tôi có thể xử lý các báo cáo để xem có bao nhiêu người đang xem hồ sơ người dùng.

Nếu bất cứ ai phản đối lý do tại sao điều này là thực tiễn tồi trong phân tích, tôi sẽ rất vui khi nghe về nó. Khá mới khi sử dụng Google Analytics, vì vậy đừng quá chắc chắn liệu đây có phải là cách tiếp cận tốt nhất hay không.


1

Tôi đề nghị sử dụng thư viện phân tích Phân đoạn và làm theo hướng dẫn khởi động nhanh góc của chúng tôi . Bạn sẽ có thể theo dõi lượt truy cập trang và theo dõi hành động của người dùng bằng một API duy nhất. Nếu bạn có một SPA, bạn có thể cho phép RouterOutletthành phần xử lý khi trang hiển thị và sử dụng ngOnInitđể gọi pagecác cuộc gọi. Ví dụ dưới đây cho thấy một cách bạn có thể làm điều này:

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

Tôi là người duy trì https://github.com/seributionio/analytics-angular . Với Phân đoạn, bạn sẽ có thể bật và tắt các điểm đến khác nhau bằng cách bật công tắc nếu bạn muốn thử nhiều công cụ phân tích (chúng tôi hỗ trợ hơn 250 điểm đến) mà không phải viết thêm bất kỳ mã nào. 🙂


0

Hợp nhất nhiều hơn với câu trả lời của Pedro Lopez,

Tôi đã thêm phần này vào mô-đun ngGoogleAnalytis của mình (mà tôi sử dụng lại trong nhiều ứng dụng):

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

trong trường hợp này, tôi có một thẻ trong liên kết chỉ mục của mình:

  <base href="/store/">

thật hữu ích khi sử dụng chế độ html5 trên angular.js v1.3

(loại bỏ lệnh gọi hàm thay thế () nếu thẻ cơ sở của bạn không kết thúc bằng dấu gạch chéo /)

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

Nếu bạn đang tìm kiếm toàn quyền kiểm soát mã theo dõi mới của Google Analytics, bạn có thể sử dụng Angular-GA của riêng tôi .

gacó sẵn thông qua tiêm, vì vậy nó dễ dàng để kiểm tra. Nó không làm bất kỳ phép thuật nào, ngoài việc thiết lập đường dẫn trên mỗi tuyến đường. Bạn vẫn phải gửi số lần xem trang như ở đây.

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

Bổ sung có một lệnh gacho phép liên kết nhiều chức năng phân tích với các sự kiện, như thế này:

<a href="#" ga="[['set', 'metric1', 10], ['send', 'event', 'player', 'play', video.id]]"></a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.