Estou configurando um novo aplicativo usando o AngularJS como front-end. Tudo no lado do cliente é feito com o pushstate HTML5 e eu gostaria de poder acompanhar minhas visualizações de página no Google Analytics.
Estou configurando um novo aplicativo usando o AngularJS como front-end. Tudo no lado do cliente é feito com o pushstate HTML5 e eu gostaria de poder acompanhar minhas visualizações de página no Google Analytics.
Respostas:
Se você estiver usando ng-view
seu aplicativo Angular, poderá ouvir o $viewContentLoaded
evento e enviar um evento de rastreamento ao Google Analytics.
Supondo que você configurou seu código de acompanhamento no arquivo index.html principal com um nome var _gaq
e MyCtrl é o que você definiu na ng-controller
diretiva.
function MyCtrl($scope, $location, $window) {
$scope.$on('$viewContentLoaded', function(event) {
$window._gaq.push(['_trackPageView', $location.url()]);
});
}
UPDATE: para nova versão do Google Analytics, use este
function MyCtrl($scope, $location, $window) {
$scope.$on('$viewContentLoaded', function(event) {
$window.ga('send', 'pageview', { page: $location.url() });
});
}
_trackPageview
e não _trackPageView
... passou 10 minutos de coçar a cabeça :)
$rootScope.$on('$routeChangeSuccess', ...)
$rootScope
garantiria que ela não seria removida por outro evento ou alteração de DOM, e o uso routeChangeSuccess
será acionado toda vez que o a barra de localização é alterada. Em vez de sempre, você altera o modelo de origem da visualização. Isso faz sentido?
$window.ga('send', 'pageview', { page: $location.path() });
vez da $window._gaq...
parte. Além disso, convém remover ga('send', 'pageview');
do seu código GA original para evitar duplicatas quando você chegar à página pela primeira vez.
Quando uma nova visualização é carregada AngularJS
, o Google Analytics não conta como um novo carregamento de página. Felizmente, existe uma maneira de informar manualmente o GA para registrar um URL como uma nova visualização de página.
_gaq.push(['_trackPageview', '<url>']);
faria o trabalho, mas como vincular isso ao AngularJS?
Aqui está um serviço que você pode usar:
(function(angular) {
angular.module('analytics', ['ng']).service('analytics', [
'$rootScope', '$window', '$location', function($rootScope, $window, $location) {
var track = function() {
$window._gaq.push(['_trackPageview', $location.path()]);
};
$rootScope.$on('$viewContentLoaded', track);
}
]);
}(window.angular));
Ao definir seu módulo angular, inclua o módulo de análise da seguinte forma:
angular.module('myappname', ['analytics']);
ATUALIZAÇÃO :
Você deve usar o novo código de rastreamento universal do Google Analytics com:
$window.ga('send', 'pageview', {page: $location.url()});
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function(){
ga('send', 'pageview', $location.path());
});
});
app.run(["$rootScope", "$location", function(...
Apenas uma adição rápida. Se você estiver usando o novo analytics.js, então:
var track = function() {
ga('send', 'pageview', {'page': $location.path()});
};
Além disso, uma dica é que o Google Analytics não será acionado no host local. Portanto, se você estiver testando no host local, use o seguinte em vez da criação padrão ( documentação completa )
ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});
$window
para acessar a janela ( ga
é provável que apenas dentro do Angular esteja undefined
). Além disso, convém remover ga('send', 'pageview');
do seu código GA original para evitar duplicatas quando você chegar à página pela primeira vez.
$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { ga('send', 'pageview', { 'page': $location.path(), 'title': toState.name }); });
$location.url()
Eu criei um serviço + filtro que poderia ajudar vocês com isso, e talvez também com alguns outros provedores, se você optar por adicioná-los no futuro.
Confira https://github.com/mgonto/angularytics e deixe-me saber como isso funciona para você.
Mesclar as respostas de wynnwu e dpineda foi o que funcionou para mim.
angular.module('app', [])
.run(['$rootScope', '$location', '$window',
function($rootScope, $location, $window) {
$rootScope.$on('$routeChangeSuccess',
function(event) {
if (!$window.ga) {
return;
}
$window.ga('send', 'pageview', {
page: $location.path()
});
});
}
]);
Definir o terceiro parâmetro como um objeto (em vez de apenas $ location.path ()) e usar $ routeChangeSuccess em vez de $ stateChangeSuccess fez o truque.
Espero que isto ajude.
Eu criei um exemplo simples no github usando a abordagem acima.
/account/:accountId
caminho aka é http://somesite.com/account/123
agora reportará o caminho como/account?accountId=123
A melhor maneira de fazer isso é usar o Gerenciador de tags do Google para disparar suas tags do Google Analytics com base nos ouvintes do histórico. Elas são incorporadas à interface do GTM e permitem facilmente o rastreamento nas interações HTML5 do lado do cliente.
Ative as variáveis internas do Histórico e crie um gatilho para disparar um evento com base nas alterações do histórico.
No seu index.html
, copie e cole o snippet ga, mas remova a linhaga('send', 'pageview');
<!-- Google Analytics: change UA-XXXXX-X to be your site's ID -->
<script>
(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', 'UA-XXXXXXXX-X');
</script>
Eu gosto de dar o seu próprio arquivo de fábrica my-google-analytics.js
com auto-injeção:
angular.module('myApp')
.factory('myGoogleAnalytics', [
'$rootScope', '$window', '$location',
function ($rootScope, $window, $location) {
var myGoogleAnalytics = {};
/**
* Set the page to the current location path
* and then send a pageview to log path change.
*/
myGoogleAnalytics.sendPageview = function() {
if ($window.ga) {
$window.ga('set', 'page', $location.path());
$window.ga('send', 'pageview');
}
}
// subscribe to events
$rootScope.$on('$viewContentLoaded', myGoogleAnalytics.sendPageview);
return myGoogleAnalytics;
}
])
.run([
'myGoogleAnalytics',
function(myGoogleAnalytics) {
// inject self
}
]);
page
caminho atual e o envia como a pageview
? Qual é a diferença de fazer dessa maneira, em vez de apenas $window.ga('send', 'pageview', {page: $location.url()});
?
Eu encontrei a gtag()
função funcionada, em vez da ga()
função.
No arquivo index.html, dentro da <head>
seção:
<script async src="https://www.googletagmanager.com/gtag/js?id=TrackingId"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'TrackingId');
</script>
No código AngularJS:
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function() {
gtag('config', 'TrackingId', {'page_path': $location.path()});
});
});
Substitua TrackingId
por seu próprio ID de acompanhamento.
Se alguém quiser implementar usando diretivas, identifique (ou crie) uma div no index.html (logo abaixo da tag body ou no mesmo nível DOM)
<div class="google-analytics"/>
e adicione o seguinte código na diretiva
myApp.directive('googleAnalytics', function ( $location, $window ) {
return {
scope: true,
link: function (scope) {
scope.$on( '$routeChangeSuccess', function () {
$window._gaq.push(['_trackPageview', $location.path()]);
});
}
};
});
Se você estiver usando o ui-router, poderá se inscrever no evento $ stateChangeSuccess assim:
$rootScope.$on('$stateChangeSuccess', function (event) {
$window.ga('send', 'pageview', $location.path());
});
Para um exemplo completo de trabalho, consulte esta postagem no blog
Use o GA 'set' para garantir que as rotas sejam selecionadas para a análise em tempo real do Google. Caso contrário, as chamadas subsequentes para o GA não serão exibidas no painel em tempo real.
$scope.$on('$routeChangeSuccess', function() {
$window.ga('set', 'page', $location.url());
$window.ga('send', 'pageview');
});
O Google recomenda fortemente essa abordagem geralmente, em vez de passar um terceiro parâmetro em 'enviar'. https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications
Para aqueles que usam o AngularUI Router em vez do ngRoute, pode usar o código a seguir para rastrear as visualizações de página.
app.run(function ($rootScope) {
$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
ga('set', 'page', toState.url);
ga('send', 'pageview');
});
});
Os desenvolvedores que criam aplicativos de página única podem usar o autotrack , que inclui um plug- in urlChangeTracker que lida com todas as considerações importantes listadas neste guia para você. Consulte a documentação do rastreamento automático para obter instruções de uso e instalação.
Estou usando o AngluarJS no modo html5. Encontrei a seguinte solução como a mais confiável:
Use a biblioteca angular-google-analytics . Inicialize-o com algo como:
//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);
}
]);
Depois disso, adicione ouvinte em $ stateChangeSuccess 'e envie o evento 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
}
});
}
]);
A qualquer momento, quando seu usuário for inicializado, você poderá injetar o Analytics no local e fazer uma ligação:
Analytics.set('&uid', user.id);
Estou usando o ui-router e meu código fica assim:
$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);
});
Dessa forma, eu posso rastrear estados diferentes. Talvez alguém ache útil.
Pessoalmente, gosto de configurar minhas análises com o URL do modelo em vez do caminho atual. Isso ocorre principalmente porque meu aplicativo possui muitos caminhos personalizados, como message/:id
ou profile/:id
. Se eu enviasse esses caminhos, teria tantas páginas visualizadas no analytics, seria muito difícil verificar quais usuários da página estão visitando mais.
$rootScope.$on('$viewContentLoaded', function(event) {
$window.ga('send', 'pageview', {
page: $route.current.templateUrl.replace("views", "")
});
});
Agora, recebo visualizações de página limpas em minhas análises, como user-profile.html
e em message.html
vez de muitas páginas profile/1
, profile/2
e profile/3
. Agora posso processar relatórios para ver quantas pessoas estão visualizando perfis de usuário.
Se alguém tiver alguma objeção a respeito de por que essa é uma prática ruim dentro do analytics, eu ficaria mais do que feliz em ouvir sobre isso. Muito novo no uso do Google Analytics, por isso não tenho certeza se essa é a melhor abordagem ou não.
Sugiro usar a biblioteca de análise de segmentos e seguir nosso guia de início rápido angular . Você poderá rastrear visitas à página e ações de comportamento do usuário com uma única API. Se você tiver um SPA, poderá permitir que o RouterOutlet
componente manipule quando a página for renderizada e use ngOnInit
para chamar page
chamadas. O exemplo abaixo mostra uma maneira de fazer isso:
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
ngOnInit() {
window.analytics.page('Home');
}
}
Eu sou o mantenedor de https://github.com/segmentio/analytics-angular . Com o segmento, você pode ativar e desativar diferentes destinos ao pressionar um botão, se estiver interessado em experimentar várias ferramentas de análise (suportamos mais de 250 destinos) sem precisar escrever nenhum código adicional. 🙂
Mesclando ainda mais a resposta de Pedro Lopez,
Adicionei isso ao meu módulo ngGoogleAnalytis (que reutilizo em muitos aplicativos):
var base = $('base').attr('href').replace(/\/$/, "");
nesse caso, tenho uma tag no meu link de índice:
<base href="/store/">
é útil ao usar o modo html5 no angular.js v1.3
(remova a chamada da função replace () se sua tag base não terminar com uma barra /)
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()
});
}
);
}
]);
Se você está procurando o controle total do novo código de rastreamento do Google Analytics, pode usar meu próprio Angular-GA .
Ele é ga
disponibilizado por injeção, facilitando o teste. Ele não faz nenhuma mágica, além de definir o caminho em cada routeChange. Você ainda precisa enviar a visualização de página como aqui.
app.run(function ($rootScope, $location, ga) {
$rootScope.$on('$routeChangeSuccess', function(){
ga('send', 'pageview');
});
});
Além disso, há uma diretiva ga
que permite vincular várias funções de análise a eventos, como este:
<a href="#" ga="[['set', 'metric1', 10], ['send', 'event', 'player', 'play', video.id]]"></a>