定时器计数器指令

时间:2014-10-01 20:36:08

标签: angularjs angularjs-directive

我已经在angularjs中写了这个示例hover counter指令。它工作,并将秒数写入控制台。它呈现" Hover Me 0"但在计算时不会更新数字。

angular.directive('countHoverTime', function() {
  return {
    link: function(scope, element, attributes) {
      scope.seconds = 0;
      var ticking = false;

      var tickTock = function() {
        scope.seconds++;
        console.log( 'tick' );
        if (ticking) {
          window.setTimeout( tickTock, 1000 );
        }
      }

      $(element).hover( function() {
        console.log('Hover In');
        scope.seconds = 0;
        ticking = true;
        tickTock();
      }, function() {
        console.log('Hover Out');
        ticking = false;
        console.log("Seconds: " + scope.seconds);
      });

    }
  };
});

和html

<p count-hover-time>Hover me! {{ seconds }} </p>

3 个答案:

答案 0 :(得分:1)

在控制台日志写入此语句之前

 scope.$apply();

答案 1 :(得分:1)

对于模型的更改会反映在视图中,您需要告诉angular进行了更改。

您应该使用$scope.$apply();来执行此操作。

angular.module('so',[])

.directive('countHoverTime', function() {
  return {
    scope: true,
    link: function(scope, element, attributes) {
      scope.seconds = 0;
      var ticking = false;

      var tickTock = function() {
        scope.seconds++;
        scope.$apply();
        console.log( 'tick' );
        if (ticking) {
          window.setTimeout( tickTock, 1000 );
        }
      }

      $(element).hover( function() {
        console.log('Hover In');
        scope.seconds = 0;
        ticking = true;
        tickTock();
      }, function() {
        console.log('Hover Out');
        ticking = false;
        console.log("Seconds: " + scope.seconds);
      });

    }
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="so">
<p count-hover-time>Hover me! {{ seconds }} </p>
 </div>

答案 2 :(得分:1)

问题是你正在使用jQuery来处理&#39; hover&#39;事件。因此Angular不知道scope.seconds已更改并且相应地无法更新视图。如果你想继续使用jQuery表示法(即$(element).hover( function() {...,你必须调用scope.$apply()强制一个摘要周期。

我建议您修改

$(element).hover(...)

以角度表示法:

element.hover(...)

由于你包含了jQuery,这相当于$(element),但是它已经变得非常混乱了#39; 有关详细信息,请参阅https://docs.angularjs.org/api/ng/function/angular.element