Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body ng-app="app" ng-controller="AppController as app">
<form name="appForm" disable-on-action="app.action" ng-submit="app.save()">
  <fieldset>
    <input type="text" /> <button type="submit">Save</button>
  </fieldset>
</form>
</body>
</html>
 
class AppController {
  
  constructor($timeout) {
    this.$timeout = $timeout;
  }
  
  save () {
    
    this.action = this.$timeout(() => {
      console.log('Data submitted');
    }, 500);
  }
  
}
function disableOnActionDirective ($document) {
  
  return {
    restrict: 'A',
    require: 'form',
    scope: {
      promise: '=disableOnAction'
    },
    link: (scope, el, attr) => {
      handleInputs(false);
      scope.$watch('promise', (promise) => {
        if (!isPromise(promise)) return;
        
        handleInputs(true);
        promise.then(passThrough, passThrough);
      });
      
      function passThrough (result) {
        handleInputs(false);
        
        return result;
      }
      
      function handleInputs (isDisabled) {
        var fieldsets = el[0].querySelectorAll('fieldset');
        for(var i = 0;i<fieldsets.length;i++) {
          fieldsets[i].disabled = isDisabled;
        }
      }
      
      function isPromise(promise) {
        
        return angular.isObject (promise) && angular.isFunction(promise.then);
      }
    }
  }
}
angular
  .module('app', [])
  .controller('AppController', AppController)
  .directive('disableOnAction', disableOnActionDirective)
;
Output 300px

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers