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.