0

私はAngular2アプリケーション用のGoogleタグマネージャのサポートを追加していますが、開発用と生産用の2つのコンテナIDを持つ必要なGTMスクリプトをどのように注入できるのか分かりませんGTMのコンテナ角2環境固有のヘッド注入

私の環境ファイルの変数に基づいてheadタグに挿入してコンテナIDを変更する方法はありますか?

私は、Angular CLIをビルドプロセスの一部として使用しています。あなたがタグマネージャのためのサービスを構築することができ

答えて

0

、私はAdWordsGoogle Trusted StoresAnalyticsなどのプロバイダのための複数のコンテナIDとイベントを処理私の会社のプロジェクトのために1を自分で構築しました。

これは、タグマネージャスクリプトを挿入するモデルのサンプルバージョンです。 (注:これが原因直接documentwindowを使用して、準備ができていない普遍的です。)

export class TagManager { 
private static instance: TagManager = null; 
private ids: string[]; 
private dataLayerName: string; 
private precision: number = 2; 

public dataLayer: any[] = []; 
public language: string; 
public currency: string; 

constructor(ids: string[], dataLayerName: string, language: string, currency: string) { 
    if(TagManager.instance) { 
    throw new Error("Error - use GoogleTagManager.getInstance()"); 
    } 
    this.ids = ids; 
    this.dataLayerName = dataLayerName; 
    this.currency = currency; 
    this.language = language; 
    this.init(); 
} 

private init() { 
    this.ids.forEach(id => this.initContainer(id)); 
} 

private initContainer(id: string) { 
    let internal = this; 
    (function(w,d,s,l,i) { 
    w[l]=w[l]||[]; 
    w[l].push({ 
     'gtm.start': new Date().getTime(), 
     event:'gtm.js' 
    }); 
    let f: any = d.getElementsByTagName(s)[0]; 
    let j: any = d.createElement(s); 
    let dl: any = l!='dataLayer'?'&l='+l:''; 
    j.async=true; 
    j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl; 
    f.parentNode.insertBefore(j,f); 
    internal.dataLayer = w[l]; 
    })(window,document,'script',this.dataLayerName,id); 
} 

public static getInstance(ids: string | string[] = [], dataLayerName = 'dataLayer', language = 'en', currency = 'EUR') { 
    ids = ids || []; 
    ids = Array.isArray(ids)? ids: [ids]; 
    if(!TagManager.instance) { 
     if(ids.length === 0) { 
     return; 
     } 
     ids.forEach(id => { 
     if(!id || (typeof id !== 'string') || id.indexOf('GTM-') !== 0) { 
      console.error("Please provide a valid container ID (i.e. GTM-XXXXXX)"); 
     } 
     }) 
     if(!dataLayerName || (typeof dataLayerName !== 'string')) { 
     console.error("Please provide a valid name for the data layer"); 
     } 
    } 
    TagManager.instance = TagManager.instance || new TagManager(ids, dataLayerName, language, currency); 
    return TagManager.instance; 
    } 
} 

サービスの例:

@Injectable() 
 
export class Service { 
 
    private static instance: TagManager = null; 
 
    private eventTracker$: ReplaySubject<any> = new ReplaySubject(); 
 
    private dataStream$: ReplaySubject<any> = new ReplaySubject(); 
 
    private currency: string; 
 
    private precision: number = 3; 
 
    private language: string; 
 

 
    private readyTracker$: ReplaySubject<boolean> = new ReplaySubject<boolean>(); 
 

 
    public get settings() { 
 
    return { 
 
     language: this.language, 
 
     currency: this.currency, 
 
     precision: this.precision 
 
    } 
 
    } 
 

 
    public get eventTrack$() { 
 
    return this.eventTracker$.asObservable(); 
 
    } 
 

 
    public get dataLayer$() { 
 
    return this.dataStream$.asObservable(); 
 
    } 
 

 
    public get isReady$() { 
 
    return this.readyTracker$.asObservable(); 
 
    } 
 

 
    public get isInitialized() { 
 
    return !!Service.instance; 
 
    } 
 

 
    constructor() { 
 
    this.readyTracker$.next(false); 
 
    } 
 

 
    public init(containerIds?: string[], dataLayerName?: string, language?: string, currency?: string) { 
 
    if(Service.instance instanceof TagManager) { 
 
     console.error('Google tag manager already loaded.'); 
 
     return; 
 
    } 
 
    Service.instance = TagManager.getInstance(containerIds || [], dataLayerName || 'dataLayer', language || 'en', currency || 'EUR'); 
 
    this.currency = currency; 
 
    this.language = language; 
 
    if(!Service.instance) { 
 
     console.info('no gtm container installed'); 
 
     return; 
 
    } 
 
    this.dataLayer$.subscribe(e => { 
 
     Service.instance.dataLayer.push(e); 
 
    }); 
 
    this.readyTracker$.next(true); 
 
    } 
 

 
    public push(data: any) { 
 
    this.dataStream$.next(data); 
 
    } 
 

 
    public pushCustomEvent(eventName: string, attributes: any) { 
 
    this.push({ 
 
     event: eventName, 
 
     attributes: attributes 
 
    }); 
 
    } 
 

 
    public pushEcommerceEvent(eventName: string, eventData: any) { 
 
    this.push(Object.assign({}, { 
 
     event: eventName 
 
    }, eventData)) 
 
    } 
 
}

アドワーズ広告プロバイダの例:

@Injectable() 
 
export class AdwordsProvider { 
 
    constructor(private gtmService: Service) { } 
 

 
    public sendConversion(id: string, value: number) { 
 
    // build conversion 
 
    let conversion = { 
 
     [Fields.Conversion.attributes.id]: id, 
 
     [Fields.Conversion.attributes.value]: Number.parseFloat(value.toFixed(this.gtmService.settings.precision)).toString(), 
 
     [Fields.Conversion.attributes.currency]: this.gtmService.settings.currency 
 
    }; 
 
    // push event to dataLayer 
 
    this.gtmService.pushCustomEvent('conversionEventName', { 
 
    // event data 
 
    }); 
 
    } 
 
}

また、angulartics2のように見える場合もあります。

+0

私はangulartics2を見ていますが、あなたはまだヘッドセクションにトラッキングコードを追加する必要があります。あなたがここで行ったことに似たものを試してみるかもしれません。あなたはgtmのinit関数に名前をつけ、それをサービスコンストラクタで呼び出すことができると思います。 – kermitology

+0

サービス内で 'TagManager.getInstance'を使って初期化します(' en'や 'EUR'以外のものが必要な場合はcontainerIds、言語、通貨を収集します)。 – cyrix

関連する問題