Javascript 倒计时指令和角度控制器之间的干扰?
在我的应用程序中,两个角函数之间有一些非常奇怪的干扰,我无法解释。问题的最终结果导致出现以下情况: 我有一个倒计时指令嵌入在我的一个页面中,这也是一个角度控制器的域。下面是倒计时指令:Javascript 倒计时指令和角度控制器之间的干扰?,javascript,angularjs,Javascript,Angularjs,在我的应用程序中,两个角函数之间有一些非常奇怪的干扰,我无法解释。问题的最终结果导致出现以下情况: 我有一个倒计时指令嵌入在我的一个页面中,这也是一个角度控制器的域。下面是倒计时指令: (function() { var app = angular.module('app'); app.directive('countdown', ['$interval', function($interval) { return { restrict
(function() {
var app = angular.module('app');
app.directive('countdown', ['$interval', function($interval) {
return {
restrict: 'E',
scope: {
specificity: '=',
countdownTo: '=',
callback: '&?'
},
link: function($scope, elem, attrs) {
$scope.isLaunchExact = ($scope.specificity == 6 || $scope.specificity == 7);
$scope.$watch('specificity', function(newValue) {
$scope.isLaunchExact = (newValue == 6 || newValue == 7);
});
var countdownProcessor = function() {
var launchUnixSeconds = $scope.launchUnixSeconds;
var currentUnixSeconds = Math.floor(Date.now() / 1000);
if (launchUnixSeconds >= currentUnixSeconds) {
$scope.secondsAwayFromLaunch = launchUnixSeconds - currentUnixSeconds;
var secondsBetween = $scope.secondsAwayFromLaunch;
// Calculate the number of days, hours, minutes, seconds
$scope.days = Math.floor(secondsBetween / (60 * 60 * 24));
secondsBetween -= $scope.days * 60 * 60 * 24;
$scope.hours = Math.floor(secondsBetween / (60 * 60));
secondsBetween -= $scope.hours * 60 * 60;
$scope.minutes = Math.floor(secondsBetween / 60);
secondsBetween -= $scope.minutes * 60;
$scope.seconds = secondsBetween;
$scope.daysText = $scope.days == 1 ? 'Day' : 'Days';
$scope.hoursText = $scope.hours == 1 ? 'Hour' : 'Hours';
$scope.minutesText = $scope.minutes == 1 ? 'Minute' : 'Minutes';
$scope.secondsText = $scope.seconds == 1 ? 'Second' : 'Seconds';
} else {
}
if (attrs.callback) {
$scope.callback();
}
};
// Countdown here
if ($scope.isLaunchExact) {
$scope.launchUnixSeconds = moment($scope.countdownTo).unix();
$interval(countdownProcessor, 1000);
} else {
$scope.countdownText = $scope.countdownTo;
}
},
templateUrl: '/js/templates/countdown.html'
}
}]);
})();
以下是受干扰的角度控制器:
(function() {
var app = angular.module('app', []);
//app.value('duScrollDuration', 1000);
app.controller("homeController", ['$scope', 'Statistic', function($scope, Statistic) {
$scope.statistics = [];
$scope.activeStatistic = false;
$scope.goToClickedStatistic = function(statisticType) {
history.replaceState('', document.title, '#' + statisticType);
$scope.activeStatistic = statisticType;
};
$scope.goToNeighborStatistic = function(index) {
if (index >= 0 && index < $scope.statistics.length) {
var stat = $scope.statistics[index];
history.replaceState('', document.title, '#' + stat.camelCaseType); // WhyIsThisFlashing
$scope.activeStatistic = stat.camelCaseType;
return stat.camelCaseType;
} else {
$scope.goHome();
}
};
$scope.goToFirstStatistic = function() {
};
$scope.goHome = function() {
history.replaceState('', document.title, window.location.pathname);
$scope.activeStatistic = false;
return 'home';
};
/*$window.on('scroll',
$.debounce(100, function() {
$('div[data-stat]').fracs('max', 'visible', function(best) {
$scope.activeStatistic($(best).data('stat'));
});
})
);*/
(function() {
laravel.statistics.forEach(function(statistic) {
$scope.statistics.push(new Statistic(statistic));
});
if (window.location.hash) {
$scope.activeStatistic = window.location.hash.substring(1);
}
})();
}]);
app.factory('Statistic', function() {
return function(statistic) {
var self = {};
self.changeSubstatistic = function(newSubstatistic) {
self.activeSubstatistic = newSubstatistic;
};
statistic.forEach(function(substatistic) {
if (!self.substatistics) {
self.substatistics = [];
self.activeSubstatistic = substatistic;
self.type = substatistic.type;
self.camelCaseType = self.type.replace(" ", "");
}
self.substatistics.push(substatistic);
});
return self;
}
});
})();
为什么“goToNeighborStatistic”出现在这本书中?为什么会出现这个脚本?从那里开始,goToNeighborStatistic()
运行,此时再次调用倒计时并重复所有操作。这是怎么回事
编辑:
在Chrome中,每一步都会产生不同的结果。在countdownProcessor
函数的末尾,单步执行会产生以下结果:
我不太清楚您的问题,因为我在您的代码中找不到文本“WhyIsThisFlash”;你把它放在哪里?(我意识到“为什么闪烁”可能是调试)对不起,这只是bug的副作用。如果您查看
goToNeighborStatistic
函数,我已经注释了闪烁位。它通常会改变URL的哈希值,我只是硬编码了“WhyIsThisFlash”,用于调试目的,正如您所提到的。不过我离题了,因为我所说的一切都与实际的bug无关,哈。我猜你是在浏览浏览器(Chrome?)。如果是这样,调用堆栈会有帮助吗?我希望它能显示对SCRIPT0中代码的调用来自何处。另外,您是否已清除浏览器中的缓存?SCRIPT0看起来像控制器文件的缩小版和旧版吗?它在Firefox中被称为SCRIPT0
。Chrome将其标记为VM305
。我已经发布了文件的内容,但我没有写它。callstack并不是特别有用——它只是一步一步地通过Angular.js。我看不到任何标记,你在指令上向callback传递了什么?你的问题对我来说并不完全清楚,因为我在你的代码中找不到文本“WhyIsThisFlash”;你把它放在哪里?(我意识到“为什么闪烁”可能是调试)对不起,这只是bug的副作用。如果您查看goToNeighborStatistic
函数,我已经注释了闪烁位。它通常会改变URL的哈希值,我只是硬编码了“WhyIsThisFlash”,用于调试目的,正如您所提到的。不过我离题了,因为我所说的一切都与实际的bug无关,哈。我猜你是在浏览浏览器(Chrome?)。如果是这样,调用堆栈会有帮助吗?我希望它能显示对SCRIPT0中代码的调用来自何处。另外,您是否已清除浏览器中的缓存?SCRIPT0看起来像控制器文件的缩小版和旧版吗?它在Firefox中被称为SCRIPT0
。Chrome将其标记为VM305
。我已经发布了文件的内容,但我没有写它。callstack并不是特别有用——它只是一步一步地通过Angular.js。我看不到任何标记,您在指令上向callback传递了什么?
"use strict";
var fn=function(s,l,a,i){var v0,v1,v2,v3=l&&('goToNeighborStatistic' in l),v4,v5,v6=l&&('\u0024index' in l);v2=v3?l:s;if(!(v3)){if(s){v1=s.goToNeighborStatistic;}}else{v1=l.goToNeighborStatistic;}if(v1!=null){ensureSafeFunction(v1,text);if(!(v6)){if(s){v5=s.$index;}}else{v5=l.$index;}v4=ifDefined(v5,0)-ifDefined(1,0);ensureSafeObject(v2,text);v0=ensureSafeObject(v2.goToNeighborStatistic(ensureSafeObject(ifDefined(v5,0)-ifDefined(1,0),text)),text);}else{v0=undefined;}return v0;};return fn;