Angularjs делают простой обратный отсчет
Я хотел бы сделать countDown с Angular js. это мой код:
Файл Html
<div ng-app ng-controller = "countController"> {{countDown}} <div>
js Файл
function countController($scope){
$scope.countDown = 10;
var timer = setInterval(function(){$scope.countDown--; console.log($scope.countDown)},1000);
}
в console.log это работает, у меня есть обратный отсчет, но в {{обратном отсчете}} обновляется он не
не могли бы вы мне помочь, пожалуйста? спасибо!
Ответы
Ответ 1
Пожалуйста, взгляните на этот пример здесь. Это простой пример подсчета! Который, я думаю, вы можете легко изменить, чтобы создать обратный отсчет.
http://jsfiddle.net/ganarajpr/LQGE2/
Код JavaScript:
function AlbumCtrl($scope,$timeout) {
$scope.counter = 0;
$scope.onTimeout = function(){
$scope.counter++;
mytimeout = $timeout($scope.onTimeout,1000);
}
var mytimeout = $timeout($scope.onTimeout,1000);
$scope.stop = function(){
$timeout.cancel(mytimeout);
}
}
Разметка HTML:
<!doctype html>
<html ng-app>
<head>
<script src="http://code.angularjs.org/angular-1.0.0rc11.min.js"></script>
<script src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
</head>
<body>
<div ng-controller="AlbumCtrl">
{{counter}}
<button ng-click="stop()">Stop</button>
</div>
</body>
</html>
Ответ 2
Начиная с версии 1.3, в модуле ng: $interval
function countController($scope, $interval){
$scope.countDown = 10;
$interval(function(){console.log($scope.countDown--)},1000,0);
}
Следует использовать с осторожностью:
Примечание. Интервалы, созданные этой службой, должны быть явно уничтожены когда вы закончите с ними. В частности, они не автоматически уничтожается, когда область управления или директива элемент уничтожается. Вы должны принять это во внимание и обязательно всегда отменяйте интервал в соответствующий момент. Видеть пример ниже для более подробной информации о том, как и когда делать это.
От: Angular официальная документация.
Ответ 3
Вы должны использовать $scope. $apply() при выполнении выражения angular извне структуры angular.
function countController($scope){
$scope.countDown = 10;
var timer = setInterval(function(){
$scope.countDown--;
$scope.$apply();
console.log($scope.countDown);
}, 1000);
}
http://jsfiddle.net/andreev_artem/48Fm2/
Ответ 4
Я обновил г-н ganaraj ответ, чтобы показать функцию остановки и возобновления и добавил фильтр angular js для форматирования таймера обратного отсчета
он находится здесь на jsFiddle
код контроллера
'use strict';
var myApp = angular.module('myApp', []);
myApp.controller('AlbumCtrl', function($scope,$timeout) {
$scope.counter = 0;
$scope.stopped = false;
$scope.buttonText='Stop';
$scope.onTimeout = function(){
$scope.counter++;
mytimeout = $timeout($scope.onTimeout,1000);
}
var mytimeout = $timeout($scope.onTimeout,1000);
$scope.takeAction = function(){
if(!$scope.stopped){
$timeout.cancel(mytimeout);
$scope.buttonText='Resume';
}
else
{
mytimeout = $timeout($scope.onTimeout,1000);
$scope.buttonText='Stop';
}
$scope.stopped=!$scope.stopped;
}
});
фильтр-код, адаптированный из RobG из fooobar.com/questions/114625/...
myApp.filter('formatTimer', function() {
return function(input)
{
function z(n) {return (n<10? '0' : '') + n;}
var seconds = input % 60;
var minutes = Math.floor(input / 60);
var hours = Math.floor(minutes / 60);
return (z(hours) +':'+z(minutes)+':'+z(seconds));
};
});
Ответ 5
https://groups.google.com/forum/?fromgroups=#!topic/angular/2MOB5U6Io0A
В вызове setInterval используется отличный jsfiddle от Игоря Минара, показывающий использование $defer и wrapping $.
Ответ 6
Это может помочь "Как написать код для обратного отсчета в AngularJS"
Шаг 1: HTML-образец кода
<div ng-app ng-controller="ExampleCtrl">
<div ng-show="countDown_text > 0">Your password is expired in 180 Seconds.</div>
<div ng-show="countDown_text > 0">Seconds left {{countDown_text}}</div>
<div ng-show="countDown_text == 0">Your password is expired!.</div>
</div>
Шаг 2: Образец кода AngulaJs
function ExampleCtrl($scope, $timeout) {
var countDowner, countDown = 10;
countDowner = function() {
if (countDown < 0) {
$("#warning").fadeOut(2000);
countDown = 0;
return; // quit
} else {
$scope.countDown_text = countDown; // update scope
countDown--; // -1
$timeout(countDowner, 1000); // loop it again
}
};
$scope.countDown_text = countDown;
countDowner()
}
Полный пример обратного отсчета в AngularJs, как показано ниже.
<!DOCTYPE html>
<html>
<head>
<title>AngularJS Example - Single Timer Example</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
<script>
function ExampleCtrl($scope, $timeout) {
var countDowner, countDown = 10;
countDowner = function() {
if (countDown < 0) {
$("#warning").fadeOut(2000);
countDown = 0;
return; // quit
} else {
$scope.countDown_text = countDown; // update scope
countDown--; // -1
$timeout(countDowner, 1000); // loop it again
}
};
$scope.countDown_text = countDown;
countDowner()
}
</script>
</head>
<body>
<div ng-app ng-controller="ExampleCtrl">
<div ng-show="countDown_text > 0">Your password is expired in 180 Seconds.</div>
<div ng-show="countDown_text > 0">Seconds left {{countDown_text}}</div>
<div ng-show="countDown_text == 0">Your password is expired!.</div>
</div>
</body>
</html>
Ответ 7
Возможно, вы неправильно объявили свой модуль или поместили функцию до объявления модуля (безопасное правило - ставить angular модуль после тела после загрузки всей страницы). Поскольку вы используете angularjs, вам следует использовать $ interval (эквивалентность angularjs для setInterval, который является службой Windows).
Вот рабочее решение:
angular.module('count', [])
.controller('countController', function($scope, $interval) {
$scope.countDown = 10;
$interval(function() {
console.log($scope.countDown--);
}, 1000, $scope.countDown);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.1/angular.min.js"></script>
<body>
<div ng-app="count" ng-controller="countController"> {{countDown}} </div>
</body>
Ответ 8
function timerCtrl ($scope,$interval) {
$scope.seconds = 0;
var timer = $interval(function(){
$scope.seconds++;
$scope.$apply();
console.log($scope.countDown);
}, 1000);
}
Ответ 9
То, как я это сделал, работает!
- * угловая версия 1.5.8 и выше.
Angular код
var app = angular.module('counter', []);
app.controller('MainCtrl', function($scope, $interval) {
var decreamentCountdown = function() {
$scope.countdown -= 1;
if ($scope.countdown < 1) {
$scope.message = "timed out";
}
};
var startCountDown = function() {
$interval(decreamentCountdown, 1000, $scope.countdown)
};
$scope.countdown = 100;
startCountDown();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.6.10/angular.min.js"></script>
<body ng-app="counter" ng-controller="MainCtrl">
{{countdown}} {{message}}
</body>
Ответ 10
var timer_seconds_counter = 120;
$scope.countDown = function() {
timer_seconds_counter--;
timer_object = $timeout($scope.countDown, 1000);
$scope.timer = parseInt(timer_seconds_counter / 60) ? parseInt(timer_seconds_counter / 60) : '00';
if ((timer_seconds_counter % 60) < 10) {
$scope.timer += ':' + ((timer_seconds_counter % 60) ? '0' + (timer_seconds_counter % 60) : '00');
} else {
$scope.timer += ':' + ((timer_seconds_counter % 60) ? (timer_seconds_counter % 60) : '00');
}
$scope.timer += ' minutes'
if (timer_seconds_counter === 0) {
timer_seconds_counter = 30;
$timeout.cancel(timer_object);
$scope.timer = '2:00 minutes';
}
}