AngularJS : 제출 및 서버 응답 사이의 모든 양식 컨트롤 비활성화


122

사용자가 일종의 "저장"또는 "제출"단추를 클릭하는 기간 동안 양식 컨트롤을 비활성화 (또는 최소한 사용자 상호 작용에 사용할 수 없도록 설정)하려는 경우 최상의 (올바른) 접근 방식이 무엇인지에 대한 딜레마가 있습니다. 그리고 유선을 통해 이동하는 데이터. 나는 JQuery를 사용하고 싶지 않다 (악한 !!!) 모든 요소를 ​​배열 (클래스 또는 속성 마커로)으로 쿼리하고 싶지 않다.

  • cm-form-control"데이터 전송 됨"및 "데이터 처리됨"의 두 가지 알림을 구독 할 사용자 지정 지시문으로 모든 요소를 ​​표시합니다 . 그런 다음 사용자 지정 코드는 두 번째 알림을 푸시하거나 약속을 해결합니다.
  • 사용 promiseTracker(unfortunatelly!) 그을 적용을 같은 매우 바보 같은 코드를 생성하는 ng-show="loadingTracker.active()". 분명히 모든 요소가있는 것은 아니며 ng-disabled사용자 ng-hide/show가 "춤추는"버튼을 피하고 싶지는 않습니다 .
  • 총알을 물고 여전히 JQuery를 사용하십시오.

더 나은 아이디어가있는 사람이 있습니까? 미리 감사드립니다!

업데이트 됨 : 필드 셋 아이디어가 작동합니다. 다음은 동일한 작업을 계속하려는 사람들을위한 간단한 바이올린입니다. 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>

및 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);
    };
});

양식에서 데이터를 보내기 위해 어떤 서비스를 사용하고 있습니까? $ http 또는 $ resource?
François Romain

내가 뛰어난 것을 다룰 필요가 없기 때문에 실제로 $ http입니다.
YoMan78 2014

비활성화 된 필드 셋은 IE에서 작동하지 않습니다. 즉, 솔루션이 아닙니다. 부트 스트랩 모달을 사용하고 배경을 정적으로 설정했습니다.
im1dermike 2015-08-12

작성 시점에 flexbox 컨테이너로 사용할 수없는 버그fieldset있습니다
George Mauer

답변:


283

모든 필드를 fieldset에 래핑하고 다음 과 같이 ngDisabled 지시문을 사용 하십시오.

<fieldset ng-disabled="isSaving"> ... inputs ...</fieldset>

필드 셋 내의 모든 입력을 자동으로 비활성화합니다.

그런 다음 컨트롤러에서 설정 $scope.isSavingtrueHTTP 전에 호출하고 false이후.


<버튼>으로도 잘 작동하는 것 같습니다! 고마워요 사샤.
YoMan78 2014

9
안타깝게도 fieldset의 disabled 속성은 IE 또는 Safari에서 지원되지 않지만 w3schools.com/tags/att_fieldset_disabled.asp
kiwiaddo 2010 년

5
@kiwiaddo 내 테스트에서 IE9 +에서 잘 작동합니다. 그건 그렇고 w3schools.com은 최고의 참조 웹 사이트가 아닙니다. 더 나은이 페이지를 확인 developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
알렉산더 Puchkov

3
입력 유형 버튼, 텍스트 및 파일이 IE11에서 비활성화되지 않음 :-(, 버튼도 회색으로 표시되지만 각도 ng-click-handler가 여전히 실행됩니다.
Sebastian

3
@ im1dermike 맞아요, IE에서는 실제로 작동하지 않습니다. 이 필드는 시각적으로 비활성화 된 것으로 스타일이 지정되지만 사용자는 여전히 필드와 상호 작용하고 활성화 된 것처럼 편집 할 수 있습니다. IE에 이미 제출 된 버그가 있으며 수정되었지만 아직 배송되지 않았습니다. 다음 IE 주요 릴리스에서 사용할 수 있습니다. connect.microsoft.com/IE/feedbackdetail/view/962368/…
Alexander Puchkov

-5

최신 브라우저에는 간단한 솔루션이 있습니다.

  1. CSS 클래스 정의

    .disabled {
      pointer-events: none;
      ... ...
    }
    
  2. 이 수업에 추가 ng-form

    <ng-form data-ng-class="{ 'disabled': isSaving }"> ... inputs ... </ng-form>

다음 포인터 이벤트 지원 차트입니다.

참고 :을 설정하더라도 pointer-events: none키보드로 요소를 입력 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.