<script>
(function(i,s,o,g,r,a,m){...})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXXXXX-X', 'auto');
// Remove this line to avoid sending the first page view twice.
//ga('send', 'pageview');
</script>
<!--
Load your ng2 app after ga.
This style of deferred script loading doesn't guarantee this will happen
but you can use Promise's or what works for your particular project.
-->
<script defer type="text/javascript" src="/app.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=<%= GOOGLE_ANALYTICS_ID %>"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '<%= GOOGLE_ANALYTICS_ID %>'); <!-- Remove that one -->
</script>
import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router'
import { Title } from '@angular/platform-browser';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(
private router: Router,
private titleService: Title
){ }
ngOnInit() {
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
(<any>window).gtag('config', '<%= GOOGLE_ANALYTICS_ID %>', {
'page_title' : this.titleService.getTitle(),
'page_path': event.urlAfterRedirects
});
}
});
}
}
对于index.html:
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=<%= GOOGLE_ANALYTICS_ID %>"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
</script>
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
(<any>window).ga('set', 'page', event.urlAfterRedirects);
// ----------
//use the following 3 lines of code to use
//correnct titles for routes
// ----------
let currentRoute = this.route.root;
let title = this.getPageTitle(currentRoute);
(<any>window).ga('set', 'title', title);
(<any>window).ga('send', 'pageview');
}
});
...其中getPageTitle方法如下:
getPageTitle = function (currentRoute: ActivatedRoute) {
let data;
do {
const childrenRoutes = currentRoute.children;
currentRoute = null;
childrenRoutes.forEach(route => {
if (route.outlet === 'primary') {
currentRoute = route;
data = route.snapshot.data;
}
});
} while (currentRoute);
return data.title;
};
6条答案
按热度按时间doinxwow1#
我设法通过订阅路由器上的更改,检查路线是否确实发生了变化(我有时会在一些路线上得到多个事件),然后将新路径发送到谷歌来实现这一点。
在加载angular2应用程序之前,您还需要在主索引文件中包含google分析代码,以便全局
ga
对象存在,但您不希望两次发送初始视图。作为您自己实现GA的替代方案,Angulartics2库也是一个用于实现GA跟踪的流行工具,并且还与其他分析供应商集成。
hgc7kmma2#
扩大伊恩的答案。你可以使用Rx的内置功能来处理当前和新路线之间的区别。
我们使用distinctUntilChanged操作符使观察者只发出NavigationEnd类型的项,并且这些项与之前发出的项没有相同的路由。
flvlnr443#
如果您在2017年8月之后遇到这个问题,那么您最有可能应该使用gtag.js(Google Universal Analytics全球网站标签)而不是旧的analytics.js。我建议您在继续之前检查Migrate from analytics.js to gtag.js页面中两者之间的差异,以及How gtag.js works in Single page applications。
当你从Google Analytics获取代码片段时,它看起来像这样:
您需要删除脚本的最后一行,并将其余部分添加到
index.html
中。然后,您必须将从上面的脚本中删除的行添加到代码 * 中,并将页面添加到track* 中。基本上,这与上面的家伙为
analytics.js
建议的几乎相同,但现在您使用gtag.js
函数。例如,如果你想跟踪你打开的所有页面,这里是示例代码:
如果您已经阅读了
gtag.js
的文档,那么您就会知道可能有大量的跟踪选项,但是我在这里只关注最基本的用法。oymdgrw74#
在Angular 6中,我建议app.component.ts:
对于index.html:
您可以使用Angular提供的标题服务来管理页面的标题:https://angular.io/guide/set-document-title
jxct1oxe5#
假设每条角路线在
app.routing.ts
中都有自己的标题:前面提到的解决方案仍然会在Google Analytics Report上为每条路线显示相同的页面标题。为了使用相应的Angular 路线标题(而不是一直使用index.html
<title>
标签内容),请在app.component.ts
中使用以下代码...其中
getPageTitle
方法如下:注意:此解决方案适用于Angular 5及以下。在Angular 6中,也可以使用TitleService
nhn9ugyo6#