У меня есть 2 даты - начало и конец. Я хочу подтвердить (и заверить) начало < конец. Я получаю уведомление, что они меняются с помощью $ watch, а затем я иду и меняю их, чтобы убедиться, что условие выполнено, но затем он снова запускает $ watch, а затем я получаю максимальные итерации, достигнутые в $ digest, и все идет на юг.
Так что мой вопрос: как изменить переменные, которые наблюдаются внутри $watch
, не вызывая бесконечного цикла. (Помимо того больше проверок и изменять их только тогда, когда они на самом деле должно быть изменено)
Вот мой код:
var TIME_DAY = 1000 * 60 * 60 * 24;
$scope.$watch('timeFilter.startTime', function() {
validateStartEndTime();
},true);
$scope.$watch('timeFilter.endTime', function() {
validateStartEndTime();
},true);
function validateStartEndTime() {
if ($scope.timeFilter.startTime != null && $scope.timeFilter.endTime != null) {
// Remove all seconds
if ($scope.timeFilter.startTime.getSeconds() > 0)
$scope.timeFilter.startTime.setSeconds(0);
if ($scope.timeFilter.endTime.getSeconds() > 0)
$scope.timeFilter.endTime.setSeconds(0);
if ($scope.timeRange.minTime.getSeconds() > 0)
$scope.timeRange.minTime.setSeconds(0);
if ($scope.timeRange.maxTime.getSeconds() > 0)
$scope.timeRange.maxTime.setSeconds(0);
// When start time isn't before end time
if ($scope.timeFilter.startTime >= $scope.timeFilter.endTime) {
// We want to increase end time by 1 minute, if possible - do it. Else - reduce start time by 1 minute
if ($scope.timeFilter.endTime < $scope.timeRange.maxTime) {
$scope.timeFilter.endTime.setMinutes($scope.timeFilter.startTime.getMinutes() + 1);
} else {
$scope.timeFilter.startTime.setMinutes($scope.timeFilter.startTime.getMinutes() - 1);
}
}
// Start time before min time
if ($scope.timeFilter.startTime < $scope.timeRange.minTime) {
$scope.timeFilter.startTime = $scope.timeRange.minTime;
if ($scope.timeFilter.endTime <= $scope.timeFilter.startTime) {
$scope.timeFilter.endTime = $scope.timeFilter.startTime;
$scope.timeFilter.endTime.setMinutes($scope.timeFilter.endTime.getMinutes() + 1);
}
}
// End time after max time
if ($scope.timeFilter.endTime > $scope.timeRange.maxTime) {
$scope.timeFilter.endTime = $scope.timeRange.maxTime;
if ($scope.timeFilter.startTime >= $scope.timeFilter.endTime) {
$scope.timeFilter.startTime = $scope.timeFilter.endTime;
$scope.timeFilter.startTime.setMinutes($scope.timeFilter.startTime.getMinutes() - 1);
}
}
}
}
просто установите переменную флага. установите флаг, когда ваше условие истинно, и разрешите любое действие, если флаг еще не установлен. –
Я думаю, вам будет лучше обслуживать использование угловых завершенных событий DOM для проверки даты, например 'ng-blur',' ng-change' ... – tiledcode
Я бы пошел с логической переменной, например. manualChange. Это должно быть установлено в false в начале validateStartEndTime. Затем в каждом часе, если manualChange имеет значение true, вызывается validateStartEndTime, иначе установите для параметра ManualChange значение true и return. – dchar