【问题标题】:Updating angular.js view in an interval间隔更新 angular.js 视图
【发布时间】:2014-07-22 00:58:41
【问题描述】:

我想用 angular.js 制作一个类似 shuffler 的东西。这个想法是在开始时每 200 毫秒升级一次视图,使用一个新字符串,然后慢慢增加延迟,直到字符串不再更改并选择一个字符串。我的问题是 angular 有类似防御如此快速变化的值的功能,因为当我在控制器中执行此代码时,只显示第一个随机字符串。

$scope.shuffleStrings = function () {

        var arrayOfStrings = ['this', 'that', 'foo', 'bar', 'bim', 'bam', 'bum'];
        var delay = 100;

        var updateValue = function () {         

            $scope.crntString = arrayOfStrings[Math.floor(Math.random() * arrayOfStrings.length)];

            if(delay <= 1000) {
                delay += (10/100)*delay
                setTimeout(updateValue, delay);
            }
        }

        updateValue();
    }

【问题讨论】:

    标签: string angularjs random settimeout


    【解决方案1】:

    使用 $timeout 代替 setTimeout。阅读更多:https://docs.angularjs.org/api/ng/service/$timeout

    【讨论】:

      【解决方案2】:

      为此使用 $interval...

          $scope.arrayOfStrings = ['this', 'that', 'foo', 'bar', 'bim', 'bam', 'bum'];
          $scope.delay = 100;
      
          var updateValue = function () {         
      
              $scope.crntString = $scope.arrayOfStrings[Math.floor(Math.random() * 
                   $scope.arrayOfStrings.length)];
      
              if($scope.delay <= 1000) {
                  $scope.delay += (10/100)*$scope.delay
              }
          }
      
          var interval = $interval(updateValue,200);
      
         $scope.$on("$destroy", function(){
             $interval.cancel(interval);
         });
      

      您的字符串没有得到更新,因为您使用的是 setTimeout,请使用 $timeout,这是一种更有角度的方式...

      【讨论】:

      • 但我愿意将延迟更改为下一个功能,检查我使用的内容,看看它是否符合标准或提出改进建议;)
      • 我的回答。抱歉,我的速度不是很快。
      • 这个答案有用吗??如果是的话,你能接受/赞成吗??
      【解决方案3】:

      我不想使用简单的间隔,而是使用 Timeout,因为我愿意每次都更改延迟。问题是我执行了另一个函数,它不是角度函数,因此值不会更新。我的解决方案是一个简单的$scope.$apply();。以下是完整代码:

      $scope.shuffleStrings = function () {
      
              var arrayOfStrings = ['this', 'that', 'foo', 'bar', 'bim', 'bam', 'bum'];
              var delay = 100;
      
              var updateValue = function () {         
      
                  $scope.crntString = arrayOfStrings[Math.floor(Math.random() * arrayOfStrings.length)];
                  $scope.$apply();
      
                  if(delay <= 1000) {
                      delay += (10/100)*delay
                      setTimeout(updateValue, delay);
                  }
              }
      
              updateValue();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        相关资源
        最近更新 更多