지시문을 사용하여 AngularJS 브라우저 자동 채우기 해결 방법


111

AngularJS에서 양식을 제출하고 브라우저 암호 기억 기능을 사용할 때, 후속 로그인 시도에서 브라우저가 사용자 이름과 암호로 로그인 양식을 채우도록하면 $scope모델이 자동 채우기를 기반으로 변경되지 않습니다.

내가 찾은 유일한 더러운 해킹은 다음 지시문을 사용하는 것입니다.

app.directive("xsInputSync", ["$timeout" , function($timeout) {
    return {
        restrict : "A",
        require: "?ngModel",
        link : function(scope, element, attrs, ngModel) {
            $timeout(function() {
                if (ngModel.$viewValue && ngModel.$viewValue !== element.val()) {
                    scope.apply(function() {
                        ngModel.$setViewValue(element.val());
                    });
                }
                console.log(scope);
                console.log(ngModel.$name);
                console.log(scope[ngModel.$name]);
            }, 3000);
        }
    };
}]);

문제는 반환 된 값 ngModel.$setViewValue(element.val());에 따라 모델이나 뷰를 변경하지 않는다는 것 element.val()입니다. 어떻게 할 수 있습니까?


이 코드는 처음에는 괜찮아 보이지만 나머지는 어디에 있습니까 (마크 업 등)? 우리가 볼 수있는 바이올린이나 멍청이가 있습니까?
Ben Lesh 2013

다음은 plunk입니다 . plnkr.co/edit/CHrBAVU9Ycl2ex2DRr6R iframe에서 실행되기 때문에 plunker에서 직접 작동하는지 확실하지 않습니다.
lucassp

1
angular의 $ timeout 안에 scope. $ apply가 필요하지 않습니다. 네이티브 window.setTimeout 안에 필요할 수 있습니다. 그러나 앵귤러를 사용하는 것이 더 좋습니다.
gorpacrate

1
이 문제에 대한 Angular dev tbosch"공식"polyfill 수정 사항 이 있습니다. 아래의 답변 stackoverflow.com/a/25687396/3009639의 세부 사항을 참조하십시오 .
orszaczky 2014 년

안타깝게도 "공식적인"수정은 포기한 것이며 많은 브라우저에서 작동하지 않습니다. 문제 제기되었지만 검색이 계속되도록 해결되지 않습니다 ...
cyberwombat

답변:


45

분명히 이것은 Angular의 알려진 문제이며 현재 열려 있습니다.

나는 당신이 시도하는 것과 같은 일종의 일 외에 여기서 당신이 무엇을 할 수 있는지 잘 모르겠습니다. 올바른 길을 가고있는 것 같습니다. 내 브라우저가 귀하의 플렁크에 대한 암호를 기억하도록 할 수 없었기 때문에 이것이 작동하는지 확실하지 않지만 살펴 보았습니다.

app.directive('autoFillSync', function($timeout) {
   return {
      require: 'ngModel',
      link: function(scope, elem, attrs, ngModel) {
          var origVal = elem.val();
          $timeout(function () {
              var newVal = elem.val();
              if(ngModel.$pristine && origVal !== newVal) {
                  ngModel.$setViewValue(newVal);
              }
          }, 500);
      }
   }
});
<form name="myForm" ng-submit="login()">
   <label for="username">Username</label>
   <input type="text" id="username" name="username" ng-model="username" auto-fill-sync/><br/>
   <label for="password">Password</label>
   <input type="password" id="password" name="password" ng-model="password" auto-fill-sync/><br/>
   <button type="submit">Login</button>
</form>

접근 방식을 약간 단순화해야한다고 생각합니다. 내가 확실히 추천하는 한 가지는 ngModel.$pristine불량한 사용자의 입력을 덮어 쓰지 않는지 확인 하고 확인하는 것입니다. 또한 3 초는 아마도 너무 깁니다. $ timeout, BTW에서 $ apply ()를 호출 할 필요는 없습니다. 자동으로 $ digest를 큐에 넣어야합니다.

진짜 캐치 : 브라우저가 Angular를 능가할까요? 내 브라우저는 어떻습니까?

이것은 아마도 승리 할 수없는 전쟁 일 것입니다. 이것이 Angular (또는 Knockout)가 쉽게 해결할 수 없었던 이유입니다. 지시문이 처음 실행될 때 입력 데이터의 상태를 보장 할 수 없습니다. Angular의 초기화 시점에도 .... 그래서 해결하기 까다로운 문제입니다.


1
$ pristine에 대한 좋은 지적입니다. 음, 테스트 목적으로 3 초가 있습니다. "암호 저장"대화 상자가 Safari에서 작동하는 것 같습니다. 그것은 제가 조사해야 할 또 다른 문제입니다.
lucassp

로컬 저장소로 그를 속여보세요. :) ... 나는 그것에 대해 계속 생각할 것입니다. 그러나 양방향 바인딩에서 자동 채우기가 작동하도록 만드는 가능성에 대해 의구심이 있습니다.
Ben Lesh 2013

예,하지만 작동하려면 지시문에서 모델을 업데이트 할 수 있어야합니다.
lucassp

1
나는 localStorage에 대해 농담하고 있었는데, 거기에 암호를 보관하고 싶지 않을 것입니다.
Ben Lesh 2013

1
이 자동 완성은 사용자에 의해 언제든지 트리거되므로 Safari 및 신용 카드 자동 완성에서는 작동하지 않습니다
Dallas Clark

35

다음은 제시된 다른 솔루션보다 훨씬 덜 해킹적이고 의미 론적으로 건전한 AngularJS 솔루션입니다. http://victorblog.com/2014/01/12/fixing-autocomplete-autofill-on-angularjs-form-submit/

myApp.directive('formAutofillFix', function() {
  return function(scope, elem, attrs) {
    // Fixes Chrome bug: https://groups.google.com/forum/#!topic/angular/6NlucSskQjY
    elem.prop('method', 'POST');

    // Fix autofill issues where Angular doesn't know about autofilled inputs
    if(attrs.ngSubmit) {
      setTimeout(function() {
        elem.unbind('submit').submit(function(e) {
          e.preventDefault();
          elem.find('input, textarea, select').trigger('input').trigger('change').trigger('keydown');
          scope.$apply(attrs.ngSubmit);
        });
      }, 0);
    }
  };
});

그런 다음 양식에 지시문을 첨부하기 만하면됩니다.

<form ng-submit="submitLoginForm()" form-autofill-fix>
  <div>
    <input type="email" ng-model="email" ng-required />
    <input type="password" ng-model="password" ng-required />
    <button type="submit">Log In</button>
  </div>
</form>

2
이것은 작동했습니다. 결과없이 위의 대부분을 시도했습니다. 감사!!! 결과는 mobbr.com에 있습니다
Patrick Savalle 2014 년

1
이것은 jQuery를 사용하므로 jQuery 없이는 작동하지 않을 것으로 예상됩니다.
Quinn Strahl 2014 년

1
여기 우리는 2018 년이고 이것은 여전히 ​​수정입니다. 감사합니다 에스겔!
Scott Manny

35

a $timeout또는 이와 비슷한 것을 사용할 필요가 없습니다 . 이벤트 시스템을 사용할 수 있습니다.

나는 그것이 더 Angularish라고 생각하며 jQuery 또는 사용자 정의 이벤트 포착에 의존하지 않습니다.

예를 들어 제출 핸들러에서 :

$scope.doLogin = function() {
    $scope.$broadcast("autofill:update");

    // Continue with the login.....
};

그리고 다음 autofill과 같은 지시문을 가질 수 있습니다 .

.directive("autofill", function () {
    return {
        require: "ngModel",
        link: function (scope, element, attrs, ngModel) {
            scope.$on("autofill:update", function() {
                ngModel.$setViewValue(element.val());
            });
        }
    }
});

마지막으로 HTML은 다음과 같습니다.

<input type="text" name="username" ng-model="user.id" autofill="autofill"/>

14
제 경우에는 입력이 비어있는 동안 제출 버튼이 비활성화됩니다.
gorpacrate

4
비동기이기 때문에 문제가 없습니까? 이벤트가 복제되기 전에 서버에 대한 로그인 호출이 이미 떠났고 지시문이 범위를 업데이트 할 시간이 있었습니까?
Sander 2014 년

12

더 이상 해킹 할 필요가 없습니다! Angular dev tbosch 는 브라우저가 변경 이벤트를 트리거하지 않고 양식 필드를 변경할 때 변경 이벤트를 트리거하는 폴리 필을 만들었습니다.

https://github.com/tbosch/autofill-event

현재로서는 브라우저의 버그 수정이므로 Angular 코드에 빌드하지 않을 것이며 Angular 없이도 작동합니다 (예 : 일반 jQuery 앱의 경우).

"폴리 필은 문서로드시 변경 사항과 입력이 남아있을 때도 확인합니다 (동일한 양식에서만).하지만 원하는 경우 수동으로 확인을 트리거 할 수 있습니다.

이 프로젝트에는 단위 테스트와 반자동 테스트가 있으므로 마침내 필요한 브라우저 설정과 함께 모든 다른 사용 사례를 수집 할 수있는 장소가 생겼습니다.

참고 :이 폴리 필은 일반 AngularJS 앱, AngularJS / jQuery 앱뿐만 아니라 Angular를 사용하지 않는 일반 jQuery 앱에서도 작동합니다. "

다음과 함께 설치할 수 있습니다.

bower install autofill-event --save

페이지에서 jQuery 또는 Angular autofill-event.js 뒤에 스크립트를 추가합니다 .

이렇게하면 다음이 수행됩니다.

  • DOMContentLoaded 이후 : 모든 입력 필드 확인
  • 필드가 남아 있음 : 동일한 양식의 다른 모든 필드를 확인하십시오.

API (수동으로 확인 트리거) :

  • $el.checkAndTriggerAutoFillEvent(): 주어진 jQuery / jQLite 요소에서 모든 DOM 요소에 대한 검사를 실행합니다.

작동 원리

  1. 사용자 (변경 이벤트 수신) 및 JavaScript (jQuery / jQLite 요소에 대해 $ el.val () 가로 채기)에 의한 입력 요소의 모든 변경 사항을 기억하십시오. 변경된 값은 개인 속성의 요소에 저장됩니다.

  2. 자동 채우기를위한 요소 확인 : 요소의 현재 값을 기억 된 값과 비교합니다. 다른 경우 변경 이벤트를 트리거합니다.

의존성

AngularJS 또는 jQuery (하나 또는 둘 모두에서 작동)

더 많은 정보와 소스는 github 페이지에 있습니다.

Github의 원래 Angular Issue # 1460은 여기에서 읽을 수 있습니다.


2
제 경우에는 작동하지 않습니다. checkAndTriggerAutoFillEvent ()가 트리거되고 이벤트를 생성하지만 AngularJS는 모델을 업데이트하지 않고 필드가 비어 있다고 생각합니다.
Splaktar 2014 년

이 폴리 일을 사용하는 데 문제가 없었습니다. 제대로 작동하지 않으면 코드를 포함하여 별도의 질문을 만들어야합니다. 버그를 발견하면 github에서 티켓을 확인하거나 새 티켓을 열어야합니다.
orszaczky

네,이 버그와 관련이 있다고 생각합니다 : github.com/tbosch/autofill-event/issues/11
Splaktar

1
ngModelOptions결합 autofill-event은 이제 모델이 올바르게 동기화되었는지 확인하기 위해 이벤트 change중 하나로 지정할 수 있음을 의미합니다 updateOn.
morloch

10

더티 코드, 이 코드를 사용하기 전에 https://github.com/angular/angular.js/issues/1460#issuecomment-18572604 문제 가 수정 되었는지 확인 하세요 . 이 지시문은 제출 전뿐만 아니라 필드가 채워질 때 이벤트를 트리거합니다 (제출 전에 입력을 처리해야하는 경우 필요함).

 .directive('autoFillableField', function() {
    return {
                   restrict: "A",
                   require: "?ngModel",
                   link: function(scope, element, attrs, ngModel) {
                       setInterval(function() {
                           var prev_val = '';
                           if (!angular.isUndefined(attrs.xAutoFillPrevVal)) {
                               prev_val = attrs.xAutoFillPrevVal;
                           }
                           if (element.val()!=prev_val) {
                               if (!angular.isUndefined(ngModel)) {
                                   if (!(element.val()=='' && ngModel.$pristine)) {
                                       attrs.xAutoFillPrevVal = element.val();
                                       scope.$apply(function() {
                                           ngModel.$setViewValue(element.val());
                                       });
                                   }
                               }
                               else {
                                   element.trigger('input');
                                   element.trigger('change');
                                   element.trigger('keyup');
                                   attrs.xAutoFillPrevVal = element.val();
                               }
                           }
                       }, 300);
                   }
               };
});

5

명확한 직선 솔루션처럼 보입니다. jQuery가 필요하지 않습니다.

최신 정보:

  • 모델 값이 실제 입력 값과 같지 않은 경우에만 모델이 업데이트됩니다.
  • 검사는 첫 번째 자동 완성에서 멈추지 않습니다. 예를 들어 다른 계정을 사용하려는 경우.

app.directive('autofillable', ['$timeout', function ($timeout) {
    return {
        scope: true,
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            scope.check = function(){
                var val = elem[0].value;
                if(ctrl.$viewValue !== val){
                    ctrl.$setViewValue(val)
                }
                $timeout(scope.check, 300);
            };
            scope.check();
        }
    }
}]);

4
내가 생각 해낸 것과 유사한 +1 좋은 솔루션. 내가 제안하는 유일한 추가는 모델 $pristine을 변경하기 전에 먼저 확인한 다음 변경 한 후에 $pristine상태를 유지하는 것 입니다. 그렇지 않으면 양식이 자동 채우기 데이터없이로드되는 경우 위의 지시문이 여전히 모델을 업데이트 dirty하고 양식 컨트롤이 여전히 변경되지 않은 것으로 간주되어야하는 경우 에도 모델을 만듭니다 . 예를 들어, 귀하의 지시문을 사용하십시오. 나는 그것을 추가 할 코드에서 주석했습니다 jsfiddle.net/OACDesigns/L8Sja/4
OACDesigns

1
또한, 나는 생각 scope:true해야한다scope:{}
OACDesigns

4

해결 방법 1 [$ timeout 사용] :

지령:

app.directive('autoFillSync', function($timeout) {
    return {
      require: 'ngModel',
      link: function(scope, elem, attrs, model) {
          var origVal = elem.val();
          $timeout(function () {
              var newVal = elem.val();
              if(model.$pristine && origVal !== newVal) {
                  model.$setViewValue(newVal);
              }
          }, 500);
      }
    };
});

HTML :

<form name="myForm" ng-submit="login()">
  <label for="username">Username</label>
  <input type="text" id="username" name="username" ng-model="username" auto-fill-sync/><br/>
  <label for="password">Password</label>
  <input type="password" id="password" name="password" ng-model="password" auto-fill-sync/><br/>
  <button type="submit">Login</button>
</form>

해결 방법 2 [각도 ​​이벤트 사용] :

참조 : Becko의 대답

지령:

app.directive("autofill", function () {
    return {
        require: "ngModel",
        link: function (scope, element, attrs, ngModel) {
            scope.$on("autofill:update", function() {
                ngModel.$setViewValue(element.val());
            });
        }
    };
});

HTML :

<form name="myForm" ng-submit="login()">
  <label for="username">Username</label>
  <input type="text" id="username" name="username" ng-model="username" autofill/><br/>
  <label for="password">Password</label>
  <input type="password" id="password" name="password" ng-model="password" autofill/><br/>
  <button type="submit">Login</button>
</form>

해결 방법 3 [릴레이 메서드 호출 사용] :

지령:

app.directive('autoFill', function() {
    return {
        restrict: 'A',
        link: function(scope,element) {
            scope.submit = function(){
                scope.username = element.find("#username").val();
                scope.password = element.find("#password").val();
                scope.login();//call a login method in your controller or write the code here itself
            }

        }
    };
});

HTML :

<form name="myForm" auto-fill ng-submit="submit()">
   <label for="username">Username</label>
   <input type="text" id="username" name="username" ng-model="username" />
   <label for="password">Password</label>
   <input type="password" id="password" name="password" ng-model="password" />
   <button type="submit">Login</button>
</form>

2
솔루션 1은 한동안 매우 잘 작동했지만 이제 angularjs 1.4.9에서는 더 이상 작동하지 않습니다. model.$valid지시문을 체크인 하면 이전과 이후에 모두 true를 반환 $setViewValue하지만 요소는 여전히 ng-invalid클래스 와 함께 있습니다
John

4

글쎄, 가장 쉬운 방법은 브라우저의 동작을 에뮬레이트하는 것이므로 변경 이벤트에 문제가 있으면 직접 실행하십시오. 훨씬 간단합니다.

지령:

yourModule.directive('triggerChange', function($sniffer) {
    return {
        link : function(scope, elem, attrs) {
            elem.on('click', function(){
                $(attrs.triggerChange).trigger(
                    $sniffer.hasEvent('input') ? 'input' : 'change'
                );
            });
        },
        priority : 1
    }
});

HTML :

<form >
    <input data-ng-model="user.nome" type="text" id="username">

    <input data-ng-model="user.senha" type="password" id="password" >

    <input type="submit" data-ng-click="login.connect()" id="btnlogin" 
           data-trigger-change="#password,#username"/>
</form>

양식에 지시문을 배치하고 양식 제출시 .dirty 클래스를 사용하여 모든 입력에 대해 이벤트를 발생시키는 것과 같은 몇 가지 변형을 수행 할 수 있습니다.


3

이것은 jQuery 방식입니다.

$(window).load(function() {
   // updates autofilled fields
   window.setTimeout(function() {
     $('input[ng-model]').trigger('input');
   }, 100);
 });

이것은 Angular 방법입니다.

 app.directive('autofill', ['$timeout', function ($timeout) {
    return {
        scope: true,
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            $timeout(function(){
                $(elem[0]).trigger('input');
                // elem.trigger('input'); try this if above don't work
            }, 200)
        }
    }
}]);

HTML

<input type="number" autofill /> 

2
완전히 비 각진 방식.
gorpacrate 2013

1
@gorpacrate : 이제 각도로 확인하십시오.
Nishchit Dhanani 2013

2
Angular Way의 탭에 공백이 너무 많습니다. 농담이야. 저는 수평 스크롤을 좋아합니다.
Daniel Birowsky Popeski

요소에 대한 기능 트리거가 없기 때문에 각도에서 작동하지 않습니다. 나는이 jQuery를 포함하도록 요구 생각
토마스

1
triggerHandler('input')당신이 완전한 jquery를 가지고 있지 않다면 괜찮을 것입니다
Mutmatt

1

덜 해커하지만 컨트롤러에 추가 코드가 필요한 또 다른 해결 방법이 있습니다.

HTML :

<form ng-submit="submitForm()" ng-controller="FormController">
    <input type="text" ng-model="username" autocomplete-username>
    <input type="submit">
</form>

지시문 (CoffeeScript) :

directives.directive 'autocompleteUsername', ->
    return (scope, element) ->
        scope.getUsername = ->
            element.val()

제어 장치:

controllers.controller 'FormController', [->
    $scope.submitForm = ->
        username = $scope.getUsername?() ? $scope.username
        # HTTP stuff...
]

이게 바닐라 자바 ​​스크립트에 있나요?
f1lt3r

: CoffeeScript.org는 번역가 제공 여기 일을

1

이것은 제출 버튼의 비활성화 / 활성화를 포함하여 모든 Angular의 유효성 검사가 설계된대로 작동하도록 허용 한 유일한 솔루션입니다. bower 및 1 개의 스크립트 태그로 설치합니다. 바 징가!

https://github.com/tbosch/autofill-event


1
이 폴리 채우기는 양식 상태에 대한 제출 버튼 / 입력 바인딩에 맞지 않습니다. 다이제스트를 트리거하려는 지점을 페이지를 클릭하지 않는 한 (브라우저가 실제 채우기를 실행하는 것처럼 보임) 버튼이 활성화됩니다. 수동 테스트와 테스트 페이지
전자 구름

1

시간 초과 기능을 사용하는 대신 모델 값을 변경하는 것이 효과적이었습니다.

내 코드는 다음과 같습니다.

module.directive('autoFill', [ function() {
    return {
        require: 'ngModel',
        link:function(scope, element, attr, ngModel) {
            var origVal = element.val();
            if(origVal){
                ngModel.$modelValue = ngModel.$modelValue || origVal;
            }
        }
    };
}]);

1

제출 처리기에서 한 줄짜리 해결 방법 (jQuery 필요) :

if (!$scope.model) $scope.model = $('#input_field').val();

지시문에 있다면 실제로 한 줄짜리가 아닙니다.
isherwood

0

제출시 $ setValue (val ())을 강제합니다. ( jQuery 없이 작동 함 )

   var ValidSubmit = ['$parse', function ($parse) {
    return {
        compile: function compile(tElement, tAttrs, transclude) {
            return {
                post: function postLink(scope, element, iAttrs, controller) {
                    var form = element.controller('form');
                    form.$submitted = false;
                    var fn = $parse(iAttrs.validSubmit);
                    element.on('submit', function(event) {
                        scope.$apply(function() {
                            var inputs = element.find('input');
                            for(var i=0; i < inputs.length; i++) {
                                var ele = inputs.eq(i);
                                var field = form[inputs[i].name];
                                field.$setViewValue(ele.val());
                            }
                            element.addClass('ng-submitted');
                            form.$submitted = true;
                            if(form.$valid) {
                                fn(scope, {$event:event});
                            }
                        });
                    });
                    scope.$watch(function() { return form.$valid}, function(isValid) {
                        if(form.$submitted == false) return;
                        if(isValid) {
                            element.removeClass('has-error').addClass('has-success');
                        } else {
                            element.removeClass('has-success');
                            element.addClass('has-error');
                        }
                    });
                }
            }
        }
    }
}]
app.directive('validSubmit', ValidSubmit);

0

저는 Angularjs를 처음 접했지만 그 문제에 대한 간단한 해결책을 찾았습니다 => Angular가 표현을 재평가하도록 ... 변경하여! (물론 초기 상태로 되돌리려면 초기 값을 기억해야합니다.) 다음은 양식을 제출하기 위해 컨트롤러 함수에 들어가는 방식입니다.

    $scope.submit = function () {
                var oldpassword = $scope.password;
                $scope.password = '';
                $scope.password = oldpassword;
//rest of your code of the submit function goes here...

물론 암호 입력에 입력 한 값은 사용자가 아닌 창에 의해 설정되었습니다.


0

이 코드를 시도해 볼 수 있습니다.

yourapp.directive('autofill',function () {

    return {
        scope: true,
        require: 'ngModel',
        link: function (scope, elem, attrs, ctrl) {
            var origVal = elem.val();
            if (origVal != '') {
                elem.trigger('input');
            }
        }
    }
});

0

이 답변에 대한 사소한 수정 ( https://stackoverflow.com/a/14966711/3443828 ) : $ timeout 대신 $ interval을 사용하여 브라우저를 경주 할 필요가 없습니다.

mod.directive('autoFillSync', function($interval) {
    function link(scope, element, attrs, ngModel) {
        var origVal = element.val();
        var refresh = $interval(function() {
          if (!ngModel.$pristine) {
            $interval.cancel(refresh);
          }else{
            var newVal = element.val();
            if (origVal !== newVal) {
              ngModel.$setViewValue(newVal);
              $interval.cancel(refresh);
            }
          }
        }, 100);
    }

    return {
      require: 'ngModel',
      link: link
    }
  });

0

이것은 내가 내 양식에서 사용한 솔루션입니다.

.directive('autofillSync', [ function(){
  var link = function(scope, element, attrs, ngFormCtrl){
    element.on('submit', function(event){
      if(ngFormCtrl.$dirty){
        console.log('returning as form is dirty');
        return;
      }   
      element.find('input').each(function(index, input){
        angular.element(input).trigger('input');
      }); 
    }); 
  };  
  return {
    /* negative priority to make this post link function run first */
    priority:-1,
    link: link,
    require: 'form'
  };  
}]);

그리고 양식의 템플릿은

<form autofill-sync name="user.loginForm" class="login-form" novalidate ng-submit="signIn()">
    <!-- Input fields here -->
</form>

이런 식으로 ng-model에있는 모든 파서 / 포매터를 실행하고 제출 기능을 투명하게 유지할 수있었습니다.


0

지시문이없는 솔루션 :

.run(["$window", "$rootElement", "$timeout", function($window, $rootElement, $timeout){

        var event =$window.document.createEvent("HTMLEvents");
        event.initEvent("change", true, true);

        $timeout(function(){

            Array.apply(null, $rootElement.find("input")).forEach(function(item){
                if (item.value.length) {
                    item.$$currentValue = item.value;
                    item.dispatchEvent(event);
                }
            });

        }, 500);
    }])

0

이것은 Firefox와 Chrome에서 테스트 한 모든 경우에 적용되는 간단한 수정입니다. 최상위 답변 (시간 초과가있는 지시문)에 문제가 있음을 유의하십시오.

  • 브라우저 뒤로 / 앞으로 버튼, 페이지로드 이벤트를 다시 실행하지 않음 (수정 사항이 적용되지 않음)
  • 페이지로드 후 얼마 동안 자격 증명을로드합니다. 예를 들어 Firefox에서는 로그인 상자를 두 번 클릭하고 저장된 자격 증명 중에서 선택합니다.
  • 유효한 입력이 제공 될 때까지 로그인 버튼을 비활성화하기 때문에 양식 제출 전에 업데이트하는 솔루션이 필요합니다.

이 수정은 분명히 매우 멍청하고 엉뚱하지만 100 % 작동합니다.

function myScope($scope, $timeout) {
    // ...
    (function autoFillFix() {
        $timeout(function() { 
            $('#username').trigger('change'); 
            $('#password').trigger('change'); 
            autoFillFix(); }, 500);                    
    })();
}

1
대체 할 수 $timeout$interval미래는 조금 더 상황을 DEV들과 이상한 찾고 재귀 호출이 벌어 없애주고
Mutmatt

0

이 솔루션 중 어느 것도 내 사용 사례에 적합하지 않았습니다. ng-change를 사용하여 변경 사항을 확인하는 양식 필드가 있습니다. 사용$watch 은 자동 완성에 의해 트리거되지 않으므로 도움이되지 않습니다. 제출 버튼이 없기 때문에 솔루션 중 일부를 실행하는 쉬운 방법이 없으며 간격을 사용하여 성공하지 못했습니다.

나는 자동 완성 기능을 비활성화했습니다. 이상적이지는 않지만 사용자에게는 훨씬 덜 혼란 스러웠습니다.

<input readonly onfocus="this.removeAttribute('readonly');">

여기 에서 답을 찾았습니다 .


-1

jQuery를 사용하는 경우 양식 제출에서 다음을 수행 할 수 있습니다.

HTML :

<form ng-submit="submit()">
    <input id="email" ng-model="password" required 
           type="text" placeholder="Your email">
    <input id="password" ng-model="password" required 
           type="password" placeholder="Password">
</form>

JS :

 $scope.submit = function() {
     $scope.password = $('#password').val();
}

1
이것이 작동 할 수 있지만 더 복잡한 양식에는 합리적이지 않습니다.
origin1tech 2014 년

-1

간단하게 유지하려면 자바 스크립트를 사용하여 값을 얻으십시오.

각도 js 컨트롤러에서 :

var username = document.getElementById ( 'username'). value;


난 당신이 문제가 무엇인지 이해 해달라고 생각
aelor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.