2

La manipulation DOM dans un contrôleur angulaire semble être fausse. Mais cela ne vient pas sans quelques maux de tête :)Demande asynchrone et bouton de chargement avec AngularJS

J'ai un bouton, et en ng-clic, il va effectuer une requête asynchrone en arrière-plan. Pendant le temps de cette requête asynchrone, je voudrais que tous les boutons (et peut-être quelques éléments supplémentaires sur la page) soient désactivés et que le bouton cliqué ait des icônes de chargement en cours de lecture.

Quelle est la manière la plus propre de le faire?

+0

double possible de [Prévention/traitement des clics double bouton dans angulaire] (http://stackoverflow.com/questions/18130808/prevention-dealing-with-double-click-clicks-in-angular) – mattias

Répondre

8

Je le fais généralement avec une variable sur le $ scope appelé chargement. Chaque fois qu'une opération asynch est en cours, il suffit de la définir sur true. Ensuite, tout ce qui doit être désactivé ou affecté peut baser son état sur cela.

Voici une commande factice:

function TestCtrl($scope, $http) { 
    $scope.loading = false; 

    $scope.doASynch = function() { 
     $scope.loading = true; 
     $http.get("/url").success(function() { 
      $scope.loading = false; 
     }); 
    } 
} 

Et voici un exemple de modèle.

<div ng-controller="TestCtrl"> 
    <a class="button" ng-disabled="loading" ng-click="doASynch()"> 
     <span ng-hide="loading">Click me!</span> 
     <span ng-show="loading">Loading....</span> 
    </a> 
</div> 
+0

J'ai eu la même idée mais j'étais un peu inquiet sur la façon de le rendre vraiment sympa. Je pense que c'est certainement la base pour cela, mais j'aimerais ajouter une animation, peut-être pour faire disparaître les autres boutons. Si je veux appliquer des effets jQuery, comment pourrais-je faire? Avez-vous une idée? – TigrouMeow

+1

@JordyMeow vous pouvez le poster comme une prochaine question SO, après avoir accepté la réponse de Mike;) – Cherniv

+0

Très bien, je vais poster la question plus tard :) Je suis en train de créer une directive par moi-même maintenant, mais je voudrais savoir comment les gars le feraient aussi. Merci! – TigrouMeow

0

Voici exactement ce que vous recherchez

Loading animations with Asynchronous HTTP Requests in Angular JS

var app = angular.module('myapp', ["ui.utils", "ui.router"]); 

    app.factory('iTunesData', function($http) { 
     return { 
      doSearch: function(sQuery) { 
       //return the promise directly. 
       return $http.jsonp('http://itunes.apple.com/search', { 
         params: { 
          "callback": "JSON_CALLBACK", 
          "term": sQuery 
         } 
        }); 
      } 
     } 
    }); 

    app.controller('iTunesSearch', function($scope, $location, $routeParams, iTunesData) { 
     $scope.search = function() { 
      iTunesData2.doSearch($scope.searchTerm) 
      .then(function(result) { 
        $scope.data = result.data; 
        $location.path($scope.searchTerm); 
       }); 
     } 
     $scope.searchTerm = $location.$$path.split("/")[1]; 
     if($scope.searchTerm!="") { 
      $scope.search(); 
     } 
    }); 
+0

Le lien est rompu. –

Questions connexes