J'ai un dilemme sur la meilleure approche (et la bonne) si je veux désactiver les contrôles de formulaire (ou au moins les rendre indisponibles pour l'interaction de l'utilisateur) pendant une période pendant laquelle l'utilisateur clique sur le bouton "Enregistrer" ou "Soumettre" et les données voyageant sur le fil. Je ne veux pas utiliser JQuery (ce qui est mal !!!) et interroger tous les éléments sous forme de tableau (par classe ou marqueur d'attribut) Les idées que j'avais jusqu'à présent sont:
- Marquez tous les éléments avec
cm-form-control
une directive personnalisée qui s'abonnera à 2 notifications: "données envoyées" et "données traitées". Ensuite, le code personnalisé est chargé d'envoyer une deuxième notification ou de résoudre une promesse. - Utilisez
promiseTracker
cela (malheureusement!) Pour produire du code extrêmement stupide commeng-show="loadingTracker.active()"
. Évidemment, tous les éléments n'ont pasng-disabled
et je ne veux pas que l'utilisateurng-hide/show
évite les boutons de "danse". - Mordez une balle et utilisez toujours JQuery
Quelqu'un a-t-il une meilleure idée? Merci d'avance!
MISE À JOUR: L'idée de fieldset fonctionne. Voici un simple violon pour ceux qui veulent toujours faire de même http://jsfiddle.net/YoMan78/pnQFQ/13/
HTML:
<div ng-app="myApp">
<ng-form ng-controller="myCtrl">
Saving: {{isSaving}}
<fieldset ng-disabled="isSaving">
<input type="text" ng-model="btnVal"/>
<input type="button" ng-model="btnVal" value="{{btnVal}}"/>
<button ng-click="save()">Save Me Maybe</button>
</fieldset>
</ng-form>
</div>
et JS:
var angModule = angular.module("myApp", []);
angModule.controller("myCtrl", function ($scope, $filter, $window, $timeout) {
$scope.isSaving = undefined;
$scope.btnVal = 'Yes';
$scope.save = function()
{
$scope.isSaving = true;
$timeout( function()
{
$scope.isSaving = false;
alert( 'done');
}, 10000);
};
});
javascript
forms
angularjs
submit
YoMan78
la source
la source
fieldset
ne peut pas être utilisé comme conteneur flexboxRéponses:
Enveloppez tous vos champs dans fieldset et utilisez la directive ngDisabled comme ceci:
Il désactivera automatiquement toutes les entrées dans le fieldset.
Ensuite, dans le contrôleur, réglez
$scope.isSaving
surtrue
avant l'appel http et surfalse
après.la source
Il existe une solution simple dans les navigateurs modernes:
définir une classe css
ajouter cette classe à
ng-form
Voici legraphique de prise en charge des événements de pointeur .
Remarque: même si vous définissez
pointer-events: none
, vous pouvez toujours tabuler pour entrer l'élément avec votre clavier.la source