Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angularjs Chrome autocomplete dilemma

I have a simple login form which works just peachy unless you use Chrome's auto complete feature.

If you start typing and use the auto complete feature and it auto populates your password, my angularjs model does not have any value for the password.

I tried to turn autocomplete off by setting the attribute on the form autocomplete="off" but that doesn't seem to have any effect.

How can I either: 1. Ensure that I can get the value if someone uses Chrome's auto-complete feature? 2. Disable Chrome's auto-complete feature?

<form class="form-signin" name="form" ng-submit="login()" autocomplete="off">          <h3>Login</h3>          <input type="email" name="email" class="form-control" placeholder="Email address" ng-model="user.email" required autofocus>         <input type="password" name="password" class="form-control" placeholder="Password" ng-model="user.password" required>          <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>   </form> 
like image 513
Catfish Avatar asked Jan 16 '14 17:01

Catfish


1 Answers

From the link added in the comment:Github Issue's

// Due to browsers issue, it's impossible to detect without a timeout any changes of autofilled inputs // https://github.com/angular/angular.js/issues/1460 // https://github.com/angular/angular.js/issues/1460#issuecomment-28662156 // Could break future Angular releases (if use `compile()` instead of `link()) // TODO support select angular.module("app").config(["$provide", function($provide) {     var inputDecoration = ["$delegate", "inputsWatcher", function($delegate, inputsWatcher) {         var directive = $delegate[0];         var link = directive.link;          function linkDecoration(scope, element, attrs, ngModel){             var handler;             // By default model.$viewValue is equals to undefined             if(attrs.type == "checkbox"){                 inputsWatcher.registerInput(handler = function(){                     var value = element[0].checked;                     // By default element is not checked                     if (value && ngModel.$viewValue !== value) {                         ngModel.$setViewValue(value);                     }                 });             }else if(attrs.type == "radio"){                 inputsWatcher.registerInput(handler = function(){                     var value = attrs.value;                     // By default element is not checked                     if (element[0].checked && ngModel.$viewValue !== value) {                         ngModel.$setViewValue(value);                     }                 });             }else{                 inputsWatcher.registerInput(handler = function(){                     var value = element.val();                     // By default value is an empty string                     if ((ngModel.$viewValue !== undefined || value !== "") && ngModel.$viewValue !== value) {                         ngModel.$setViewValue(value);                     }                 });             }              scope.$on("$destroy", function(){                 inputsWatcher.unregisterInput(handler);             });              // Exec original `link()`             link.apply(this, [].slice.call(arguments, 0));         }          // Decorate `link()` don't work for `inputDirective` (why?)         /*          directive.link = linkDecoration;          */         // So use `compile()` instead         directive.compile = function compile(element, attrs, transclude){             return linkDecoration;         };         delete directive.link;          return $delegate;     }];      $provide.decorator("inputDirective", inputDecoration);     $provide.decorator("textareaDirective", inputDecoration);     //TODO decorate selectDirective (see binding "change" for `Single()` and `Multiple()`) }]).factory("inputsWatcher", ["$interval", "$rootScope", function($interval, $rootScope){     var INTERVAL_MS = 500;     var promise;     var handlers = [];      function execHandlers(){         for(var i = 0, l = handlers.length; i < l; i++){             handlers[i]();         }     }      return {         registerInput: function registerInput(handler){             if(handlers.push(handler) == 1){                 promise = $interval(execHandlers, INTERVAL_MS);             }         },         unregisterInput: function unregisterInput(handler){             handlers.splice(handlers.indexOf(handler), 1);             if(handlers.length == 0){                 $interval.cancel(promise);             }         }     } }]); 
like image 159
Pauli Price Avatar answered Oct 10 '22 11:10

Pauli Price