我使用角度计时器。
这项工作:
{{ (seconds / 10) * 100 }}
但这个没有:
{{ (seconds / secondsToAnswer ) * 100 }
(评估为NaN)
但是,我在控制器中将secondsToAnswer
设置为10:$scope.secondsToAnswer = 10;
它也发生在指令之外。
完整代码:
HTML
<timer interval="1000">
<div class="progress">
<div class="progress-bar progress-bar-info progress-bar-striped"
role="progressbar"
aria-valuenow="20"
aria-valuemin="0"
aria-valuemax="100"
style="width: {{ (seconds / secondsToAnswer) * 100 }}%">
</div>
</div>
</timer>
JS
'use strict';
vocabApp.controller('PracticeController', function ($scope) {
$scope.expressions = [
{ expression:'cat', meaning:'macska' },
{ expression:'dog', meaning:'kutya' },
{ expression:'whale', meaning:'bálna' }
];
//$scope.timerRunning = true;
$scope.startTimer = function () {
$scope.secondsToAnswer = 10;
$scope.$broadcast('timer-start');
$scope.timerRunning = true;
};
$scope.stopTimer = function () {
$scope.$broadcast('timer-stop');
$scope.timerRunning = false;
};
$scope.$on('timer-stopped', function (event, args) {
console.log('timer-stopped args = ', args);
});
})
这是因为$scope.secondsToAnswer = 10;
只会在startTimer运行时执行,直到时间$scope.secondsToAnswer
未定义为止。
如果您将$scope.secondsToAnswer = 10;
作为控制器中的第一行,那么它应该可以工作。
我认为问题来自两个方面。首先,正如Sander_P所指出的,$scope.secondsToAnswer
应该在控制器的顶部定义,而不是在startTimer
函数中。现在的另一件事是,你的控制器包装了timer
指令,但实际上应该在里面
例如:
<timer interval="1000">
<div ng-controller="PracticeController" class="progress">
<div class="progress-bar progress-bar-info progress-bar-striped"
role="progressbar"
aria-valuenow="20"
aria-valuemin="0"
aria-valuemax="100"
style="width: {{ (seconds / secondsToAnswer) * 100 }}%">
</div>
</div>
</timer>
我在这里做了一个工作jsfiddle演示:
var vocabApp = angular.module("APP", ['timer']);
vocabApp.controller('PracticeController', function ($scope) {
$scope.secondsToAnswer = 100;
$scope.expressions = [{
expression: 'cat',
meaning: 'macska'
}, {
expression: 'dog',
meaning: 'kutya'
}, {
expression: 'whale',
meaning: 'bálna'
}];
//$scope.timerRunning = true;
$scope.startTimer = function () {
$scope.$broadcast('timer-start');
$scope.timerRunning = true;
};
$scope.stopTimer = function () {
$scope.$broadcast('timer-stop');
$scope.timerRunning = false;
};
$scope.$on('timer-stopped', function (event, args) {
console.log('timer-stopped args = ', args);
});
});
-
$scope.secondsToAnswer应在函数外部全局声明,而不是在调用startTimer时声明。
-
在HTML代码中,应该包装需要使用作用域的区域。在这种情况下,在定时器指令内