2014-10-19 61 views
0

我有包含以下按钮的AngularJS页:试图绑定了在事件改变变量

<button class="ui button" ng-click="startTimer()" ng-show="!timerRunning">START</button> 
<button class="ui button" ng-click="stopTimer()" ng-show="timerRunning">STOP</button> 

我也有这个片的代码在我的控制器定义:

$scope.timerRunning = false; 
$scope.timerDone = false; 


$scope.startTimer = function() { 
    $scope.$broadcast('timer-start'); 
    $scope.timerRunning = true; 
    $scope.timerDone = false; 
}; 

$scope.stopTimer = function() { 
    $scope.$broadcast('timer-stop'); 
    $scope.timerRunning = false; 
    $scope.timerDone = true; 
}; 


$scope.$on('timer-stopped', function (event, data) { 
    console.log('Timer Stopped - data = ', data); 
}); 

$scope.$on('timer-tick', function (event, args) { 
    if (args.millis == 0) { 
     $scope.stopTimer(); 
    } 
}); 

我预计当计时器达到0时(这是一个倒数计时器taken from here),标志timerDonetimerRunning将会改变,按钮也会显示。但实际上并没有发生。我调试它,看到我进入stopTimer()方法,并且变量被更改为,但按钮​​保持隐藏/显示,分别与定时器命中0之前相同。

我想我缺少一些与范围在这里,因为我很新的角度,但我无法弄清楚如何克服这一点。

+0

它看起来不像是所有相关的代码。你的标记中的计时器在哪里?什么是models.competitors?我强烈建议你创建一个plunkr或一个jsFiddle来获得真正的快速帮助。 – 2014-10-19 19:54:49

+0

@PhilSandler我删除了'model.competitors',因为即使它被删除,它也不起作用。计时器定义为只有'',并且它会在每个按预期工作的计时器上发送。但绑定似乎不工作:/ 我不确定'jsFiddle' - 你的意思是我应该把它作为问题的一部分? – Avi 2014-10-19 19:59:14

+0

我的意思是:创建一个完全复制问题的jsFiddle/plunkr。它让其他人更容易看到问题的实际情况,进行调试并提供帮助。我不知道是否有这方面的统计数据,但我敢打赌,链接到repro案例的帖子得到的回答比那些没有得到回应的要快许多倍。 – 2014-10-19 20:03:00

回答

0

看起来像是Rob J是正确的原型继承问题。我所做的是修复偶数听众如下(添加$scope.$apply()):

$scope.$on('timer-tick', function (event, args) { 
    if (args.millis == 0) { 
     $scope.stopTimer(); 
     $scope.$apply(); 
    } 
});