angular ng-if 또는 ng-show가 느리게 응답합니다 (2 초 지연?)


87

요청이 바쁠 때 버튼에 로딩 표시기를 표시하거나 숨기려고합니다. 요청이로드되거나로드가 완료 될 때 $ scope.loading 변수를 변경하여 각도로이를 수행합니다.

 $scope.login = function(){
     $scope.loading = true;
    apiFactory.getToken()
        .success(function(data){

        })
        .error(function(error){

        })
         .finally(function(){
               $timeout(function() {
                 $scope.loading = false;
               }, 0);
         });
 };

프런트 엔드에서 :

<button ng-disabled="loading" class="button button-outline button-positive" type="submit">
Log in 
<span ng-if="loading" class="ion-refreshing"></span>
</button>

제대로 작동하지만로드 아이콘 (이온 새로 고침)이 약 2 초 동안 표시되고 $ scope 변수는 즉시 업데이트됩니다. 나는 $ scope. $ apply를 시도했지만 여기에서 잘못된 것 같지는 않지만 범위는 요청 직후에 잘 업데이트됩니다. 빠르게 반응하지 않는 아이콘 일뿐입니다.

이해하도록 도와 주셔서 감사합니다!


2
관련된 애니메이션이 있습니까?
— tasseKATT 2014

부정. 관련된 애니메이션이 없습니다. 대신 ng-class를 사용하는 것이 도움이되는 것 같습니다.
— Jorre 2014

동일하거나 유사한 문제가 있습니다. 범위는 즉시 올바르게 업데이트 됩니다. 관련 요소를 표시해야하는지 확인 $scope하는 ng-if데 사용 하는 함수를 사용하여 메시지를 로깅하여이를 확인했습니다 . 그러나 버튼이 ng-if잠시 동안 잘못 표시되거나 숨겨집니다. 그런 다음 잠시 후 모든 버튼이 의도 한 표시 / 숨김 상태로 전환됩니다. — ng-hide대신 사용하여이 문제를 해결했습니다 . Angular 버전 1.2.16.
— KajMagnus

애니메이션을 사용하지 않는 사람들을위한 솔루션이 있습니까?
— Zia Ul Rehman Mughal

답변:


124

앱 구성 및 index.html 페이지에서 사용하지 않는 경우 ngAnimate를 제거해보십시오 .

angular.module('myApp', [...'ngAnimate',...])

@Spock; 여전히 ngAnimate를 사용해야하는 경우 앱 구성을 그대로두고 다음 CSS를 추가하면됩니다.

.ng-hide.ng-hide-animate{
     display: none !important;
}

조건이 충족 된 직후에 애니메이션 아이콘이 숨겨집니다.

보시다시피 .ng-hide-animate를 숨김으로 설정합니다. 이것이 애니메이션이 완료 될 때까지 대기하는 지연의 원인입니다. 위의 예 에서처럼 숨기는 대신 클래스 이름이 암시하는 것처럼 숨기기 이벤트에 애니메이션을 추가 할 수 있습니다.


1
나는 단지 부부와 함께 간단한 페이지를했다 ng-if, ng-show눈에 띄게 느렸다. 나는 제거 ngAnimate했고 그것은 나를 위해 문제를 해결했습니다. 감사!
— Eamonn Gahan

1
이것은 내가 가진 문제도 해결했습니다 ... ngAnimate의 존재로 인해 느린 전환이 발생한 이유를 아십니까?
— Clark

ngAnimate를 제거하면 같은 문제가 해결되었습니다.하지만 이것은 좋지 않습니다. .. 많은 모듈에서 멋진 애니메이션을 수행하려면 ngAnimate가 필요합니다. 어떻게해야합니까? ngAnimattias 어디 계세요? :)
— Spock

21
의 경우 요소 ng-if에만 추가하면 .ng-leave { display:none; }나에게 트릭이 생겼습니다 ( !important필요하지 않았습니다).
— Joao

40

나는 같은 문제가 있었고 ng-if 또는 ng-show / ng-hide를 사용하는 대신 '숨겨진'클래스 이름과 함께 ng-class를 사용하여 요소를 숨기는 방식으로 해결했습니다.


1
애니메이션 및 / 또는 이벤트 핸들러와 관련된 것 같습니다. 정말 확실하지 왜 다른 사람이 느린,하지만 난 알고 싶습니다
— 티아고 축제

1
어떻게 할 수 있습니까?
— jsmedmar

이것은 훨씬 더 빠릅니다! 왜 이런거야??
— Aron

1
ngAnimate를 사용하면 ng-if / ng-show를 사용하는 요소에 진입 / 종료 애니메이션 동작이 적용되지만 ng-class 표현식의 변경에는 적용되지 않는다는 사실에 기인한다고 생각합니다.
— John Rix

@neimad이게 어떻게 끝났어? 제 경우에는 ng-if를 사용하여 속성 값이 null(api 호출을 기다리는 몇 초 동안) 테스트 해야하므로 두 개의 선택 요소가 간략하게 표시됩니다. 그래서 당신은 전혀 사용하지 ng-if 않습니까? 감사.
— Chris22

15

여기 에서 몇 가지 해결책을 찾았 지만 저에게 가장 좋은 방법은 .ng-animate 클래스의 스타일을 재정의하는 것입니다.

.ng-animate.no-animate {
    transition: 0s none;
    -webkit-transition: 0s none;
    animation: 0s none;
    -webkit-animation: 0s none;
}

HTML에서 :

<button ng-disabled="loading" class="button button-outline button-positive" type="submit">
    Log in 
    <span ng-if="loading" class="ion-refreshing no-animate"></span>
</button>

예 : http://jsfiddle.net/9krLr/27/

나는 당신을 돕길 바랍니다.


10

비슷한 문제가 발생했습니다. $scope.$evalAsync() 가 발생하여 바인딩을 강제로 업데이트했습니다.

매력처럼 작동합니다.

$scope.$apply이미 실행중인 $ digest 단계와 충돌 할 수 있으므로 사용하지 마십시오 .

if(selectedStatistics.length === 0 || selectedWorkgroups.length === 0){
    ctrl.isSaveDisabled = true;
    $scope.$evalAsync();
} else{
    ctrl.isSaveDisabled = false;
    $scope.$evalAsync();
}

나를 위해 일했습니다. 하지만 단점이 있습니까?
— Sarah Tammam

1
나는 아무것도 만난 적이 없다. 비동기 작업의 경우 매우 편리합니다.
— rach8garg

1
:)이 도움이 응답을 주셔서 감사합니다
— 사라 Tammam

이 대답은 대박 인 것 같습니다. 감사합니다.
— Abdeali Chandanwala


1

나는 사용할 때 같은 문제가 있었다.

<div *ngIf='shouldShow'>
    <!-- Rest of DIV content here -->
</div>

제 경우에는 클래스를 추가하여 해결했습니다.

.hidden {
  display: none;
}

다음을 사용하는 대신 조건부로 클래스를 추가하십시오 *ngIf.

<div [ngClass]="{'hidden': !shouldShow}">
    <!-- Rest of DIV content here -->
</div>

항상 이런 식으로 사용하는 경우 이름 shouldShow을 바꾸는 것을 고려 shouldHide하고이를 할당하는 논리를 무효화하여 다음과 같이 사용할 수 있습니다.shouldHide 대신 !shouldShow.

display: flexDIV의 기존 클래스에 대한 CSS 가 있는 경우 해당 표시 속성이 display: hidden. display: none !important대신 사용하기 쉬운 방법이 있지만 다른 방법으로 우선 순위를 보장하는 더 나은 솔루션이있는 경우가 많습니다. 다음은 대안에 대한 좋은 읽기 입니다.


0

각도 버전 1.5.x $scope.$apply()에서 조건 변경 후 추가하면 여기에 예제 함수가 있습니다.

$scope.addSample = function(PDF)
        {
            var validTypes ="application/pdf";
            if(PDF.type == validTypes)
            {
                //checking if the type is Pdf and only pdf
                $scope.samplePDF= PDF.files[0];
                $scope.validError = false;
                $scope.$apply();
            }

            else
            {
                 $scope.validError = true;
                 $scope.samplePDF= null;
                 $scope.$apply();
            }


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