【问题标题】:How to add a spinner while loading the content in AngularJS?如何在 AngularJS 中加载内容时添加微调器?
【发布时间】:2015-07-31 08:55:11
【问题描述】:

我在加载内容时使用按钮微调器,当用户点击“搜索”按钮时内容将加载,此时buttonLabel将更改为“正在搜索”并显示微调器(此处按钮将为禁用)。加载内容后(承诺已解决)buttonLabel 将恢复为“搜索”(此处将启用按钮)。

我试过下面的代码,但它总是显示微调器。

HTML:

<button class="btn btn-xs btn btn-blue" ng-click="show()">
  <span><i class="glyphicon glyphicon-off"></i></span> {{buttonLabel}}
</button>

脚本:

$scope.buttonLabel = "Search";
$scope.show = function() {
  $scope.buttonLabel = "Searching";
  $scope.test = TestService.getList( $cookieStore.get('url'),
    $rootScope.resourceName+"/students" );
    $scope.test.then( function( data ) {
      if( data.list ) {
        $scope.testData = data.list;
        $scope.buttonLabel = "Search";
      }
    }
  }

更新小提琴: http://jsfiddle.net/xc6nx235/18/

【问题讨论】:

    标签: javascript angularjs twitter-bootstrap


    【解决方案1】:
    <div ng-app="formDemo" ng-controller="LocationFormCtrl">
    <div>
        <button type="submit" class="btn btn-primary" ng-click="search()"> 
            <span ng-show="searchButtonText == 'Searching'"><i class="glyphicon glyphicon-refresh spinning"></i></span>
            {{ searchButtonText }}
        </button>
    </div>
    

    您需要做的就是使用ng-showng-hide 指令。

    ng-show="表达式"

    <span ng-show="searchButtonText == 'Searching'">
        <i class="glyphicon glyphicon-refresh spinning"></i>
    </span>
    

    仅当searchButtonText 等于字符串“正在搜索”时,此范围才可见。

    您应该了解有关 Angular 指令的更多信息。它们将来会很有用。

    祝你好运。

    演示http://jsfiddle.net/xc6nx235/16/

    【讨论】:

    • @N123 您也可以使用 ng-disabled="expression" 来禁用按钮。
    • @Jagdeep Singh:更新了问题中的小提琴链接。
    • @JagdeepSingh 嗨,2 秒后,按钮文本会发生变化,但有什么办法让它显示Searching,直到我们从服务器收到响应。?
    【解决方案2】:

    使用ng-show 显示(或不显示)加载程序ng-show="test"

    JSFiddle

    // http://icelab.com.au/articles/levelling-up-with-angularjs-building-a-reusable-click-to-edit-directive/
    
    angular.module("formDemo", [])
    
    .controller("LocationFormCtrl", function ($scope, $timeout) {
        $scope.searchButtonText = "Search";
    $scope.test="false";
    $scope.search = function() {
        $scope.test="true";
         $scope.searchButtonText = "Searching";
        $timeout(function(){
            $scope.test="false";
            $scope.searchButtonText = "Search";
        },1000)
        // Do your searching here
    }
    });
    body {
        font-family:"HelveticNeue", sans-serif;
        font-size: 14px;
        padding: 20px;
    }
    h2 {
        color: #999;
        margin-top: 0;
    }
    .field {
        margin-bottom: 1em;
    }
    .click-to-edit {
        display: inline-block;
    }
    input {
        display: initial !important;
        width: auto !important;
        margin: 0 5px 0 0 !important;
    }
    
    .glyphicon.spinning {
        animation: spin 1s infinite linear;
        -webkit-animation: spin2 1s infinite linear;
    }
    
    @keyframes spin {
        from { transform: scale(1) rotate(0deg);}
        to { transform: scale(1) rotate(360deg);}
    }
    
    @-webkit-keyframes spin2 {
        from { -webkit-transform: rotate(0deg);}
        to { -webkit-transform: rotate(360deg);}
    }
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/foundation/4.1.6/css/foundation.min.css">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    
    <!-- Optional theme -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
    
    <!-- Latest compiled and minified JavaScript -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> 
    <script src="https://rawgithub.com/angular-ui/angular-ui/master/build/angular-ui.js"></script>
      
    <div ng-app="formDemo" ng-controller="LocationFormCtrl">
        <div>
        <button type="submit" class="btn btn-primary" ng-click="search()">
           <span ng-show="test" ><i class="glyphicon glyphicon-refresh spinning"></i></span>
            {{ searchButtonText }}
        </button>
    </div>    
    </div>

    【讨论】:

    • 您好,1 秒后,按钮文本会发生变化,但有什么方法可以让它一直显示 Searching,直到我们从服务器收到响应。?
    【解决方案3】:

    你也可以使用这个简单的指令:

    https://rawgit.com/jvdvleuten/angular-button-spinner/master/demo.html

    要使用它,只需添加button-spinner='loading' 属性:

    <button class="btn btn-success" ng-click="show()" button-spinner="loading">Load</button>
    

    当作用域中的loading 变量为真时,它会在按钮内附加一个微调器。

    【讨论】:

      【解决方案4】:

      只需将ng-show 添加到您的微调器:

      <span ng-show="loading"><i class="glyphicon glyphicon-refresh spinning"></i></span>
      

      和控制器:

      .controller("LocationFormCtrl", function ($scope) {
          $scope.searchButtonText = "Search";
          $scope.loading = false;
          $scope.test="false";
          $scope.search = function() {
            $scope.test="true";
            $scope.loading="true"
            $scope.searchButtonText = "Searching";
            // Do your searching here
         }
      });
      

      然后,当您收到回复时,再次将 $scope.loading 设置为 false

      Demo

      【讨论】:

        【解决方案5】:

        在微调器跨度上使用 ng-show 这样的 ng-show="test" 指令:

        片段:

        // http://icelab.com.au/articles/levelling-up-with-angularjs-building-a-reusable-click-to-edit-directive/
        
        angular.module("formDemo", [])
        
        .controller("LocationFormCtrl", function($scope) {
          $scope.searchButtonText = "Search";
          $scope.test = "false";
          $scope.search = function() {
            $scope.test = "true";
            $scope.searchButtonText = "Searching";
            // Do your searching here
          }
        });
        </style> <!-- Ugly Hack due to jsFiddle issue:http://goo.gl/BUfGZ --> 
        <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/foundation/4.1.6/css/foundation.min.css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> <!-- Optional theme --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> <!-- Latest compiled and minified JavaScript --> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> <!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> --> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> <script src="https://rawgithub.com/angular-ui/angular-ui/master/build/angular-ui.js"></script> <style> body {
          font-family: "HelveticNeue", sans-serif;
          font-size: 14px;
          padding: 20px;
        }
        h2 {
          color: #999;
          margin-top: 0;
        }
        .field {
          margin-bottom: 1em;
        }
        .click-to-edit {
          display: inline-block;
        }
        input {
          display: initial !important;
          width: auto !important;
          margin: 0 5px 0 0 !important;
        }
        .glyphicon.spinning {
          animation: spin 1s infinite linear;
          -webkit-animation: spin2 1s infinite linear;
        }
        @keyframes spin {
          from {
            transform: scale(1) rotate(0deg);
          }
          to {
            transform: scale(1) rotate(360deg);
          }
        }
        @-webkit-keyframes spin2 {
          from {
            -webkit-transform: rotate(0deg);
          }
          to {
            -webkit-transform: rotate(360deg);
          }
        }
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
        <div ng-app="formDemo" ng-controller="LocationFormCtrl">
          <div>
            <button type="submit" class="btn btn-primary" ng-click="search()">
              <span ng-show="test"><i class="glyphicon glyphicon-refresh spinning"></i></span>
              {{ searchButtonText }}
            </button>
          </div>
        </div>

        【讨论】:

          【解决方案6】:

          您应该使用ng-class 基于$scope.test 添加/删除类.spinning。我在这里更新了你的小提琴:http://jsfiddle.net/xc6nx235/15/

          【讨论】:

            【解决方案7】:

            对于 Angular2/4,您可以使用 [hidden] 来控制微调器的可见性。这是一个Plunker

            <button class="btn btn-primary" (click)="onClickDoSomething()">
              <span [hidden]="!spin">
                    <i class="glyphicon glyphicon-refresh spinning"></i>
                </span> Do something
            </button>
            

            其中旋转定义为:

            <style>
              .spinning {
                animation: spin 1s infinite linear;
              }
            
              @keyframes spin {
                from {
                  transform: scale(1) rotate(0deg);
                }
                to {
                  transform: scale(1) rotate(360deg);
                }
              }
            </style>
            

            您的组件只需设置布尔值来控制微调器的可见性。在这个例子中,我们只是旋转 10 秒。

            import {Component} from 'angular2/core';
            import {Observable} from 'rxjs/Rx';
            
            @Component({
              selector: 'do-something',
              templateUrl: 'src/dosomething.html'
            })
            export class DoSomething {
               private spin: boolean = false;
            
               onClickDoSomething() {
                 this.spin = true;
                 this.sub = Observable.interval(10000).subscribe(x => {
                     this.sub.unsubscribe();
                     this.spin = false;
                 }); 
               }
            }
            

            【讨论】:

              猜你喜欢
              • 2023-03-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-03
              • 2021-01-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多