Angularjs Chrome autocomplete dilemma

后端 未结 15 1702
野性不改
野性不改 2020-12-05 06:56

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

相关标签:
15条回答
  • 2020-12-05 07:16

    alternative solution is just to get rid off form element and use ng-form instead, it disables all browser interferings

    <div ng-form="yourFormName" class="form-signin" ng-submit="login()">
    
    0 讨论(0)
  • 2020-12-05 07:16

    In my case, i set property autocomplete="off" in form and input.

    <form autocomplete="off">
       <input type="text" autocomplete="off">
    </form>
    
    0 讨论(0)
  • 2020-12-05 07:18

    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);
                }
            }
        }
    }]);
    
    0 讨论(0)
提交回复
热议问题