javascript - 在 Angularjs 中管理多个计数器

标签 javascript angularjs intervals

在我的应用程序中,我需要在同一页面上使用多个计数器。每个计数器都会从 0 计数到 100%,再计数到 0,然后再计数到 100%。

我使用间隔来使用下面的简化代码块来完成此操作

$interval(function() {
   if (data[counter] < 100) {
      data[counter] = data[counter] + interval;
   } else {
      data[counter] = 0;
   }
}, 1000);

我试图解决的要求是:

  • 页面上的计数器数量可能会根据数据库的结果而变化
  • 根据事件,可以启动或停止任何特定计数器
  • 必须独立定义计数器,以实现唯一的计数间隔

我认为最好的方法是创建一个独立的代码块,可以在我期望计数开始时执行,并创建一个可以执行停止命令的代码块。

我的第一次尝试是在 Angular 中创建一个服务。它对于第一个计数器效果很好,并解决了最后两个要求,但是由于 Angular 将服务视为单例,它不允许页面上有多个独立的计数器。

我的问题是寻找解决此问题的最佳方法的方向。我已经看到了将服务创建为 API 的建议,但我也看到了使用指令的潜力。有人有推荐吗?

最佳答案

这是基于指令的答案。我将实际计数器与 GUI 分开。因此,您可以使用任何您喜欢的 GUI。

计数器和 GUI 一起看起来像这样:

<counter count="counter1Count" api="counter1Api"></counter>
<counter-gui count="{{counter1Count}}" api="counter1Api"></counter-gui>

注意如何使用相同的变量将它们链接在一起。查看完整示例的代码片段:

    var app = angular.module('myApp',[]);

    app.controller('MyCtrl', ['$scope', function($scope) {
        $scope.counter1Api={};
    }]);

    app.directive('counterGui',function(){
        return {
            restrict: 'E',
            template : '<h1>{{count}}</h1>' +
            '<button ng-click="api.start()" class="btn btn-default" type="button">Start</button>' +
            '<button ng-click="api.stop()" class="btn btn-default" type="button">Stop</button>' +
            '<button ng-click="api.reset()" class="btn btn-default" type="button">Reset</button>',
            scope: {
                count : "@",
                api : "="
            }
        };
    });

    app.directive('counter',function(){
        return {
            restrict: 'E',
            controller: ['$scope','$interval', function myCounterController($scope,$interval) {
                var intervalPromise= null;
                reset();

                function reset() {
                    $scope.count= 0;
                    console.log("reset",$scope.count);
                }

                function start() {
                    // Make sure the timer isn't already running.
                    if (!intervalPromise){
                        intervalPromise= $interval(function() {
                            if ($scope.count < 100) {
                                $scope.count++;
                            } else {
                                $scope.count = 0;
                            }
                        }, 1000);
                    }
                }

                function stop() {
                    if (intervalPromise) {
                        $interval.cancel(intervalPromise);
                        intervalPromise = null;
                    }
                }

                $scope.api={
                    reset : reset,
                    start : start,
                    stop : stop
                };

            }],
            scope: {
                count : "=",
                api : "="
            }
        };
    });
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>AngularJS Counter Example</title>

    <!-- AngularJS -->
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.js"></script>

</head>
<body ng-app="myApp">

<div ng-controller="MyCtrl">
    <h1>Counter 1</h1>
    <counter count="counter1Count" api="counter1Api"></counter>
    <counter-gui count="{{counter1Count}}" api="counter1Api"></counter-gui>

    <h1>Counter 2</h1>
    <counter count="counter2Count" api="counter2Api"></counter>
    <counter-gui count="{{counter2Count}}" api="counter2Api"></counter-gui>

    <h1>Counter 3</h1>
    <p>Two GUIs displaying the same counter.</p>
    <counter count="counter3Count" api="counter3Api"></counter>
    <counter-gui count="{{counter3Count}}" api="counter3Api"></counter-gui>
    <counter-gui count="{{counter3Count}}" api="counter3Api"></counter-gui>
</div>

</body>
</html>

关于javascript - 在 Angularjs 中管理多个计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40961450/

相关文章:

javascript - 我可以 "cancel"更新面板中发生的长时间运行的进程吗?

javascript - 从外部的 javascript 控制 Flash 播放器?

javascript - SailsJS 自定义 API Hook - 子域

java - java中如何解密字符串

angularjs - 访问 Angular 指令模板中的隔离范围

c# - 在 winForm C# 中使用 System.Threading.Timer 间隔触发方法

mysql - 条件查询获取两个日期之间有间隔的数据

javascript - 间隔结束后如何调用函数?

javascript - 如何仅附加大写文本?

javascript - 取消/中止 angularJs 中的所有未决请求