参考ページのindex.htmlで実行しているもの、
html
1<script async src="https://www.googletagmanager.com/gtag/js?id=UA-*******-*"></script>
2<script>
3 window.dataLayer = window.dataLayer || [];
4 function gtag(){dataLayer.push(arguments);}
5 gtag('js', new Date());
6</script>
をAngular上で組み直して実行しちゃえばいいかと。
typescript
1// 全て、参考記事からの引用のため、質問者さんが手を加えている部分の考慮はしていない
2export class GaService {
3
4 // 前後省略
5
6 89
10 // コンポーネントから、windowと、documentを取得できるようにしておく
11 sendPageView(url: string, window: Window, document: Document): void {
12 // 初期でgaを定義してるわけではないので、下記はスルー
13 // if (!this.useGA()) { return; }
14
15 // まず、一番最初のGAのscript要素を挿入
16 const f = document.getElementByTagName('script')[0];
17 const j = document.createElement('script');
18 j.setAttribute('async', 'true');
19 j.setAttribute('src', `https://www.googletagmanager.com/gtag/js?id=${environmentから使いたい方を入れる}`);
20 f.parentNode.insertBefore(j, f);
21
22 // あとは実行系を、Angular風に書き起こす
23 window['dataLayer'] = window['dataLayer'] || [];
24 window['gtag'] = () => {
25 window['dataLayer'].push(arguments);
26 };
27 // window['gtag']('js', new Date());
28
29 if (!url.startsWith('/')) { url = /${url}; }
30 // 下記のenvironmentは使い分ける
31 window['gtag']('config', environment.analytics.id, {
32 'page_path': url
33 });
34 }
35
36 // 前後省略
37}
で、コンポーネント側からの実行は下記で。
typescript
1// 前後省略
2export class AppComponent implements OnInit {
3
4 // 前後省略
5
6 ngOnInit() {
7 // tracking
8 this.router.events
9 .filter(event => event instanceof NavigationEnd)
10 .subscribe((params: any) => {
11 // コンポーネントなら、windowとdocumentは存在するので、引数に入れる
12 this.gaService.sendPageView(params.url, window, document);
13 });
14 }
15
16}
動作検証は行っておりませんのでご了承ください。