我正在使用AngularJS作为前端搭建一个新的应用程序。客户端的所有内容都是通过HTML5 pushstate完成的,我想要能够在Google Analytics中跟踪我的页面浏览量。
我正在使用AngularJS作为前端搭建一个新的应用程序。客户端的所有内容都是通过HTML5 pushstate完成的,我想要能够在Google Analytics中跟踪我的页面浏览量。
如果您使用的是AngularUI Router而不是ngRoute,可以使用以下代码来跟踪页面浏览。
app.run(function ($rootScope) {
$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
ga('set', 'page', toState.url);
ga('send', 'pageview');
});
});
<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()]);
});
}
};
});
$rootScope.$on('$stateChangeSuccess', function (event) {
$window.ga('send', 'pageview', $location.path());
});
完整的工作示例请参见此博客文章
。$scope.$on('$routeChangeSuccess', function() {
$window.ga('set', 'page', $location.url());
$window.ga('send', 'pageview');
});
谷歌强烈建议使用此方法,而不是在“send”中传递第三个参数。 https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications
开发单页应用程序的开发人员可以使用autotrack,其中包含一个urlChangeTracker插件,可以为您处理本指南中列出的所有重要注意事项。请参阅autotrack文档,了解使用和安装说明。
我正在使用html5模式下的AngularJS。我发现以下解决方案是最可靠的:
使用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);
$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);
});
这样我可以追踪不同的状态。也许有人会发现它很有用。
我个人喜欢使用模板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
。我现在可以处理报告以查看有多少人正在查看用户资料。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');
}
}
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()
});
}
);
}
]);