AngularJS をフロントエンドとして使用して新しいアプリをセットアップしています。クライアント側のすべては HTML5 プッシュステートで行われ、Google アナリティクスでページ ビューを追跡できるようにしたいと考えています。
21 に答える
ng-view
Angular アプリで使用している場合は、イベントをリッスンして$viewContentLoaded
、追跡イベントを Google アナリティクスにプッシュできます。
メインの index.html ファイルに追跡コードを設定し、var _gaq
MyCtrlという名前で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() });
});
}
に新しいビューが読み込まれると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 モジュールを定義するときは、次のように分析モジュールを含めます。
angular.module('myappname', ['analytics']);
更新:
新しいユニバーサル Google アナリティクス トラッキング コードは、次のように使用する必要があります。
$window.ga('send', 'pageview', {page: $location.url()});
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function(){
ga('send', 'pageview', $location.path());
});
});
早速追加です。新しい analytics.js を使用している場合は、次のようになります。
var track = function() {
ga('send', 'pageview', {'page': $location.path()});
};
さらに 1 つのヒントとして、Google アナリティクスは localhost では起動しないということです。したがって、localhost でテストしている場合は、デフォルトの create の代わりに以下を使用してください (完全なドキュメント) 。
ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});
上記のアプローチを使用して、githubで簡単な例を作成しました。
index.html
で、ga スニペットをコピーして貼り付けますが、行を削除します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
}
]);
ngRoute の代わりに AngularUI Router を使用している場合は、次のコードを使用してページ ビューを追跡できます。
app.run(function ($rootScope) {
$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
ga('set', 'page', toState.url);
ga('send', 'pageview');
});
});
ui-router を使用している場合は、次のように $stateChangeSuccess イベントをサブスクライブできます。
$rootScope.$on('$stateChangeSuccess', function (event) {
$window.ga('send', 'pageview', $location.path());
});
完全な動作例については、このブログ投稿を参照してください
GA の「設定」を使用して、ルートが Google リアルタイム分析用に確実に選択されるようにします。そうしないと、GA への後続の呼び出しがリアルタイム パネルに表示されません。
$scope.$on('$routeChangeSuccess', function() {
$window.ga('set', 'page', $location.url());
$window.ga('send', 'pageview');
});
Google は、「send」で 3 番目のパラメータを渡す代わりに、一般的にこのアプローチを強くお勧めします。 https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications
AngluarJS を html5 モードで使用しています。次のソリューションが最も信頼できるものであることがわかりました。
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);
個人的には、現在のパスではなく、テンプレートの URL を使用して分析をセットアップするのが好きです。これは主に、アプリケーションにmessage/:id
やなどの多くのカスタム パスがあるためprofile/:id
です。これらのパスを送信すると、分析内で非常に多くのページが表示され、ユーザーが最もアクセスしているページを確認するのが難しくなります。
$rootScope.$on('$viewContentLoaded', function(event) {
$window.ga('send', 'pageview', {
page: $route.current.templateUrl.replace("views", "")
});
});
多くのページが、 、user-profile.html
ではなく、 、 などの分析内でクリーンなページビューを取得できるようになりました。レポートを処理して、ユーザー プロファイルを閲覧している人数を確認できるようになりました。message.html
profile/1
profile/2
profile/3
なぜこれがアナリティクスの悪い慣行なのかについて異議がある場合は、喜んでお知らせします。Google アナリティクスを使用するのは初めてなので、これが最善のアプローチかどうかはわかりません。
ペドロ・ロペスの答えとさらに融合し、
これを ngGoogleAnalytis モジュールに追加しました (多くのアプリで再利用しています):
var base = $('base').attr('href').replace(/\/$/, "");
この場合、インデックス リンクにタグがあります。
<base href="/store/">
angular.js v1.3 で html5 モードを使用する場合に便利です。
(base タグがスラッシュ / で終わらない場合は、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()
});
}
);
}
]);
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>