我正在使用AngularJS作为前端设置一个新应用。客户端上的所有操作都通过HTML5 pushstate完成,我希望能够在Google Analytics(分析)中跟踪我的页面浏览量。
我正在使用AngularJS作为前端设置一个新应用。客户端上的所有操作都通过HTML5 pushstate完成,我希望能够在Google Analytics(分析)中跟踪我的页面浏览量。
Answers:
如果您ng-view
在Angular应用中使用,则可以收听$viewContentLoaded
事件并将跟踪事件推送到Google Analytics(分析)。
假设您已经在主index.html文件中设置了名称为的跟踪代码,var _gaq
并且MyCtrl是您在ng-controller
指令中定义的内容。
function MyCtrl($scope, $location, $window) {
$scope.$on('$viewContentLoaded', function(event) {
$window._gaq.push(['_trackPageView', $location.url()]);
});
}
更新: 对于新版本的Google Analytics(分析),请使用此版本
function MyCtrl($scope, $location, $window) {
$scope.$on('$viewContentLoaded', function(event) {
$window.ga('send', 'pageview', { page: $location.url() });
});
}
_trackPageview
而不是_trackPageView
...花了10分钟的时间挠头:)
$rootScope.$on('$routeChangeSuccess', ...)
$rootScope
可以保证不会被其他事件或DOM更改删除,并且routeChangeSuccess
每次使用时都会触发位置栏会更改,而不仅仅是您每次更改视图源模板时都会更改。那有意义吗?
$window.ga('send', 'pageview', { page: $location.path() });
代替$window._gaq...
部分。另外,您可能希望ga('send', 'pageview');
从原始的GA代码中删除,以防止首次登陆页面时出现重复。
在中加载新视图时AngularJS
,Google Analytics(分析)不会将其视为新页面加载。幸运的是,有一种方法可以手动告诉GA将网址记录为新的综合浏览量。
_gaq.push(['_trackPageview', '<url>']);
会做的工作,但如何与AngularJS绑定呢?
这是您可以使用的服务:
(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));
定义角度模块时,请按以下方式包含分析模块:
angular.module('myappname', ['analytics']);
更新:
您应将新的通用Google Analytics(分析)跟踪代码与以下各项配合使用:
$window.ga('send', 'pageview', {page: $location.url()});
this.track = function($window.ga('send', 'pageview', {page: $location.url()});
这将允许您googleAnalytics.track();
在app.run()函数中使用
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function(){
ga('send', 'pageview', $location.path());
});
});
app.run(["$rootScope", "$location", function(...
只是快速补充。如果您使用的是新的analytics.js,则:
var track = function() {
ga('send', 'pageview', {'page': $location.path()});
};
此外,有一个提示是Google Analytics(分析)不会在localhost上启动。因此,如果您要在localhost上进行测试,请使用以下内容代替默认的create(完整文档)
ga('create', 'UA-XXXX-Y', {'cookieDomain': 'none'});
$window
来访问窗口(ga
很可能只在Angular内部undefined
)。另外,您可能希望ga('send', 'pageview');
从原始的GA代码中删除,以防止首次登陆页面时出现重复。
$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) { ga('send', 'pageview', { 'page': $location.path(), 'title': toState.name }); });
$location.url()
我创建了一个服务+过滤器,可以帮助您解决此问题,如果将来选择添加它们,也可以与其他一些提供商一起使用。
查看https://github.com/mgonto/angularytics,让我知道如何为您工作。
合并wynnwu和dpineda的答案对我有用。
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()
});
});
}
]);
将第三个参数设置为对象(而不只是$ location.path())并使用$ routeChangeSuccess代替$ stateChangeSuccess可以达到目的。
希望这可以帮助。
我使用上述方法在github上创建了一个简单的示例。
/account/:accountId
又拥有路径的路径http://somesite.com/account/123
,现在它将报告路径为/account?accountId=123
在中index.html
,复制并粘贴ga代码段,但删除该行ga('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>
我喜欢my-google-analytics.js
通过自我注入将其赋予自己的工厂文件:
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
使用当前路径设置,然后将其提交为pageview
?这样做而不是仅仅这样做有什么区别$window.ga('send', 'pageview', {page: $location.url()});
?
我发现该gtag()
功能有效,而不是ga()
功能。
在index.html文件的<head>
部分中:
<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>
在AngularJS代码中:
app.run(function ($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function() {
gtag('config', 'TrackingId', {'page_path': $location.path()});
});
});
替换TrackingId
为您自己的跟踪ID。
如果有人想使用指令来实现,则在index.html中标识(或创建一个div)(在body标签下,或在相同的DOM级别)
<div class="google-analytics"/>
然后在指令中添加以下代码
myApp.directive('googleAnalytics', function ( $location, $window ) {
return {
scope: true,
link: function (scope) {
scope.$on( '$routeChangeSuccess', function () {
$window._gaq.push(['_trackPageview', $location.path()]);
});
}
};
});
使用Google Analytics(分析)“设置”可确保选择路线以进行Google实时分析。否则,随后对GA的调用将不会显示在实时面板中。
$scope.$on('$routeChangeSuccess', function() {
$window.ga('set', 'page', $location.url());
$window.ga('send', 'pageview');
});
Google强烈建议采用这种方法,而不是在“发送”中传递第三个参数。 https://developers.google.com/analytics/devguides/collection/analyticsjs/single-page-applications
创建单页应用程序的开发人员可以使用autotrack,其中包括urlChangeTracker插件,该插件可以为您处理本指南中列出的所有重要注意事项。有关使用和安装说明,请参阅自动跟踪文档。
我在html5模式下使用AngluarJS。我发现以下解决方案最可靠:
使用angular-google-analytics库。用类似下面的命令初始化它:
//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);
}
]);
之后,在$ stateChangeSuccess上添加侦听器并发送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
}
});
}
]);
在任何时候,当您吸引用户时,您都可以在其中注入Google Analytics(分析)并拨打电话:
Analytics.set('&uid', user.id);
我正在使用ui-router,我的代码如下所示:
$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);
});
这样,我可以跟踪不同的状态。也许有人会觉得有用。
我个人喜欢使用模板URL而不是当前路径来设置分析。这主要是因为我的应用程序具有许多自定义路径,例如message/:id
或profile/:id
。如果要发送这些路径,那么在分析中就会看到很多页面,那么很难检查用户访问量最大的页面。
$rootScope.$on('$viewContentLoaded', function(event) {
$window.ga('send', 'pageview', {
page: $route.current.templateUrl.replace("views", "")
});
});
现在,我在自己的分析中获得了整洁的页面浏览量,例如user-profile.html
和,message.html
而不是许多页面profile/1
,profile/2
并且profile/3
。现在,我可以处理报告,以查看有多少人正在查看用户个人资料。
如果有人对为什么这是分析中的不良做法有任何异议,我将很高兴听到它。使用Google Analytics(分析)挺陌生的,所以不太确定这是否是最好的方法。
我建议使用细分分析库并遵循我们的Angular快速入门指南。您将可以使用单个API跟踪页面访问并跟踪用户行为操作。如果您有SPA,则可以允许RouterOutlet
组件在页面呈现时进行处理并用于ngOnInit
调用page
调用。下面的示例显示了一种执行此操作的方法:
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
ngOnInit() {
window.analytics.page('Home');
}
}
我是https://github.com/segmentio/analytics-angular的维护者。如果您有兴趣尝试使用多种分析工具(我们支持超过250个目的地),而无需编写任何其他代码,则使用细分功能,您可以通过轻按一下开关来切换不同的目的地。🙂
与Pedro Lopez的答案进一步融合,
我将此添加到了ngGoogleAnalytis模块中(我在许多应用中都重复使用了该模块):
var base = $('base').attr('href').replace(/\/$/, "");
在这种情况下,我的索引链接中有一个标签:
<base href="/store/">
在angular.js v1.3上使用html5模式时非常有用
(如果您的基本标记未以斜杠/结束,请删除replace()函数调用)
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()
});
}
);
}
]);
如果您希望完全控制Google Analytics(分析)的新跟踪代码,则可以使用我自己的Angular-GA。
它ga
可以通过注入获得,因此易于测试。除了在每个routeChange上设置路径外,它没有任何作用。您仍然必须像这样发送综合浏览量。
app.run(function ($rootScope, $location, ga) {
$rootScope.$on('$routeChangeSuccess', function(){
ga('send', 'pageview');
});
});
另外,还有一条指令ga
允许将多个分析功能绑定到事件,例如:
<a href="#" ga="[['set', 'metric1', 10], ['send', 'event', 'player', 'play', video.id]]"></a>