J'essaie d'utiliser Google Analytics avec angular 4, mais je ne trouve pas de @type pour ga.js dans ts.
Pour une solution rapide, j'ai utilisé ceci dans chaque composant :
declare let ga: any;
Voici comment je l'ai résolu :
Créer une fonction pour charger le GA dynamiquement qui insère le GA script avec le trackingId et l'utilisateur actuels.
loadGA(userId) {
if (!environment.GAtrackingId) return;
let scriptId = 'google-analytics';
if (document.getElementById(scriptId)) {
return;
}
var s = document.createElement('script') as any;
s.type = "text/javascript";
s.id = scriptId;
s.innerText = "(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', { trackingId: '" + **environment.GAtrackingId** + "', cookieDomain: 'auto', userId: '" + **userId** + "'});ga('send', 'pageview', '/');";
document.getElementsByTagName("head")[0].appendChild(s);
}
Créez le service pour mettre en œuvre les méthodes dont vous aurez besoin.
import { Injectable } from '@angular/core';
import { environment } from '../../../environments/environment';
declare let ga: any;
@Injectable()
export class GAService {
constructor() {
}
/**
* Checks if the GA script was loaded.
*/
private useGA() : boolean {
return environment.GAtrackingId && typeof ga !== undefined;
}
/**
* Sends the page view to GA.
* @param {string} page The path portion of a URL. This value should start with a slash (/) character.
*/
sendPageView(
page: string
) {
if (!this.useGA()) return;
if (!page.startsWith('/')) page = `/${page}`;
ga('send', 'pageview', page);
}
/**
* Sends the event to GA.
* @param {string} eventCategory Typically the object that was interacted with (e.g. 'Video')
* @param {string} eventAction The type of interaction (e.g. 'play')
*/
sendEvent(
eventCategory: string,
eventAction: string
) {
if (!this.useGA()) return;
ga('send', 'event', eventCategory, eventAction);
}
}
Puis j'utilise enfin le service injecté dans le composant.
constructor(private ga: GAService) {}
ngOnInit() { this.ga.sendPageView('/join'); }
0 votes
C'est une question assez générale. Comme il existe de nombreuses façons de gérer les globaux tiers dans Angular, mais si vous voulez un module pour l'analyse. Essayez ceci : github.com/peaksandpies/universal-analytics
0 votes
Désolé pour la question générale, je comprends que nous avons plusieurs façons de gérer les globaux tiers, mais j'ai résolu ce type de problème avec les '@types' et angular injectionToken, alors pour ce cas, il serait préférable de trouver un '@type' avec le module d'exportation. Enfin, je vous remercie pour votre aide et je vais vérifier votre solution.
1 votes
Peut-être que si tu mettais à jour la question pour expliquer comment tu utilises
ga
et quels problèmes cela vous pose. Par exemple, l'utilisation deFunction
comme type signifie qu'il a une valeur de retour nulle. D'après mon expérience, il est préférable de laisser les variables externes de ce type en tant quedefine let ga: any;
qui désactive en quelque sorte toute vérification de type. Ce qui rend le travail plus facile.0 votes
Merci @cgTag, j'ai remplacé le type de fonction par un type quelconque et créé un service pour déclarer GA seulement une fois et maintenant ça me semble bien. Comme vous l'avez demandé, j'ai mis à jour la question pour expliquer comment j'ai procédé.
1 votes
Est-ce une question ou une réponse ?