我正在尝试根据正在查看页面的环境动态更改我的 GA 跟踪 ID (UA-XXXXXXXX-X),但我似乎无法找到真正“有 Angular ”的方式来做到这一点。我正在使用 Angulartics,但我无法运行 Angulartics 可以执行任何操作之前需要的基本 GA 代码。如果我只是将 GA 代码放在页面底部,它会按预期工作,但这不是很像 Angular,而且它仍然不允许我动态设置 GA ID。
我已经尝试创建一个指令,但是当将跟踪代码放入指令的 Controller 中时,跟踪代码似乎没有运行。我已经创建了一个 Controller ,它从 rest 调用中获取环境,然后根据返回的环境分配一个 GA 代码,但是当我运行指令时,它会提前运行并且 GA 代码不会触发,或者在跟踪 ID 为仍然未定义。我还尝试将 GA 代码放入指令模板中,但由于某种原因,将代码放置在 ngAnalytics.html 模板内的脚本标签内时根本不会触发代码,即使我可以看到它在 dom 后被正确添加到页面中已加载。我是 Angular 的新手,所以我知道有一个解决方案,但我没有看到。我的指令如下:
angular.module('ngAnalytics', [])
.directive('ngAnalytics', function( servicesSrvc) {
return {
restrict: 'A',
templateUrl: 'js/directives/ngAnalytics.html',
controller: ['$scope', function($scope) {
$scope.trackingID;
$scope.getEnvDetails = function() {
var currentEnv = servicesSrvc.getEnv();
var env;
currentEnv.then(function(data) {
env = JSON.stringify(data.environment);
switch(env)
{
case 'local':
$scope.trackingID = 'disabled'; // DEV
break;
case 'dev':
$scope.trackingID = 'UA-XXX-X'; // DEV
break;
...
$scope.trackingID = 'UA-XXX-X'; // Default to dev
}
(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', $scope.trackingID, { 'cookieDomain': 'none' }); // For localhost testing
//ga('create', $scope.trackingID, 'test.com'); // For dev, qa, prod etc...
//ga('send', 'pageview'); // MUST BE DISABLED when using Angulartics
});
}
}],
link: function(scope, iElement, iAttrs, ctrl) {
}
}
});
最佳答案
我可能误解了你的问题。这听起来像是指令架构的普遍问题。您正在寻找这样的东西吗? Live demo (click).
<div analytics="trackingId"></div>
JavaScript:
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
//set this however you want, the directive doesn't care - or you can move this into the directive if you want
//$scope.trackingId = 'UA-XXX-X';
$scope.trackingId = 'disabled';
});
app.directive('analytics', function() {
return {
restrict: 'A',
scope: {
id: '=analytics'
},
link: function(scope, iElement, iAttrs) {
(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');
scope.$watch('id', function(newId, oldId) {
if (newId) {
console.log(newId);
ga('create', scope.id, { 'cookieDomain': 'none' });
}
});
}
};
});
这里重要的部分是:
scope.$watch('id', function(newId, oldId) {
if (newId) {
ga('create', scope.id, { 'cookieDomain': 'none' });
}
});
这表示仅当 scope.id 有值时才运行该函数,如果设置或更改该值,该函数将再次运行。我不确定你在用 servicesSrvc 做什么,但你可以使用该服务从 Controller 或在指令本身中设置 scope.id,无论哪种方式,如果您已经设置了 $watch,该函数将在您确定 scope.id 的值时运行。我的回答是基于您的评论,即该函数将在未定义值时运行。这就是你避免这种情况的方式。
由于您仍然无法理解该过程,我创建了另一个演示,其中包含一些 console.log 来指导您。 <强> Demo here (click).
var app = angular.module('myApp', []);
app.factory('myService', function($q, $timeout) {
var myService = {
getId: function() {
var deferred = $q.defer();
console.log('getting id');
$timeout(function() {
//deferred.resolve('UA-XXX-X');
deferred.resolve('disabled');
}, 2000);
return deferred.promise;
}
};
return myService;
});
app.directive('analytics', function(myService) {
return {
restrict: 'A',
link: function(scope, iElement, iAttrs) {
(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');
var id;
scope.$watch(
function() {
return id;
},
function(newId, oldId) {
if (newId) {
console.log('watch is calling function');
ga('create', newId, { 'cookieDomain': 'none' });
}
}
);
myService.getId().then(function(response) {
id = response;
console.log('id set to ' +response);
});
}
};
});
强>关于javascript - AngularJS 和谷歌分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792325/
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
一、机器人介绍 此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我想使用ruby-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby-prof可以写入任何输出之前杀死它。如何在不中断ruby-prof的情况下停止mongrel服务器? 最佳答案
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如