角度のあるng-ifまたはng-showの応答が遅い(2秒の遅延?)


87

リクエストがビジーのときにボタンの読み込みインジケーターを表示または非表示にしようとしています。リクエストの読み込み中または読み込みが完了したときに$ scope.loading変数を変更することで、Angularを使用してこれを行います。

 $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>

これは正常に機能しますが、読み込みアイコン(ion-refreshing)が約2秒間表示され、$ scope変数はすぐに更新されます。$ scope。$ applyを試しましたが、ここでは問題はないようです。スコープは正常に更新され、リクエストの直後に更新されます。十分な速さで応答しないのはアイコンだけです。

私がこれを理解するのを手伝ってくれてありがとう!


2
関係するアニメーションはありますか?
tasseKATT 2014年

負。アニメーションは含まれていません。代わりにng-classを使用すると役立つようです。
Jorre 2014年

同じまたは同様の問題が発生しています。スコープはすぐに正しく更新されます—関連する要素を表示する必要があるかどうかを確認するために使用する$scope関数からのメッセージをログに記録することで、これを確認しましたng-if。ただし、ボタンがng-if表示されない、または非表示になっているボタンは、しばらくの間表示されません。その後、しばらくすると、すべてのボタンが意図した表示/非表示の状態になります。—ng-hide代わりにを使用してこれを回避しました。Angularバージョン1.2.16。
KajMagnus 2015年

アニメーションを使用していない人のための解決策はありますか?
Zia Ul Rehman Mughal

回答:


124

ngAnimateを使用していない場合は、アプリのconfigページとindex.htmlページから削除してみてください。

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

@スポック; それでもngAnimateを使用する必要がある場合は、アプリの構成を変更せずに、次のCSSを追加するだけです。

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

これにより、条件が満たされた直後にアニメーションアイコンが非表示になります。

ご覧のとおり、.ng-hide-animateをhiddenに設定しています。これが、アニメーションが完了するのを待つときに遅延が発生する原因です。上記の例のように非表示にする代わりに、クラス名が示すように、非表示イベントにアニメーションを追加できます。


1
数個しかない単純なページがありましたがng-ifng-showそれは明らかに遅いものでした。削除ngAnimateして、問題を修正しました。ありがとう!
Eamonn Gahan 2015年

1
これは私も抱えていた問題を解決しました... ngAnimateの存在がなぜ遅い移行を引き起こしていたのか知​​っていますか?
クラーク

同じ問題がありました-ngAnimateを削除すると解決しました..しかしこれは良くありません..多くのモジュールはクールなアニメーションを行うためにngAnimateを必要とします..どうすればよいですか?ngAnimattiasどこにいますか?:)
スポック2015

21
の場合、要素にng-if追加するだけで.ng-leave { display:none; }うまくいきました(!important必要ありませんでした)。
Joao

40

同じ問題が発生し、ng-ifまたはng-show / ng-hideを使用する代わりに、「hidden」クラス名を持つng-classを使用して要素を非表示にすることで回避しました。


1
アニメーションやイベントハンドラーに関連しているようです。他の人が遅い理由はよくわかりませんが、知りたいのですが
チアゴフェスタ

1
どうすればこれを行うことができますか?
jsmedmar 2016

これはとても速いです!どうしてこれなの??
アロン2016年

1
これは、ngAnimateを使用すると、ng-if / ng-showを使用する要素に開始/終了アニメーションの動作が適用されますが、ng-class式の変更には適用されないという事実に単純に起因すると思います。
ジョンリックス2017

@neimadこれはどのように行われますか?私の場合、ng-ifを使用して、プロパティ値がnull(api呼び出しを数秒間待機している)かどうかをテストする必要があるため、2つのselect要素が短時間表示されます。それで、あなたはまったく使っていませんng-if か?ありがとう。
Chris 2219年

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

私のために働いた。しかし、それは何か不利な点がありますか?
サラ・Tammam

1
私は何も遭遇していません。非同期操作の場合に非常に便利です。
rach8garg

1
有益な返信をありがとう:)
SarahTammam18年

この答えは大当たりのようです、ありがとう。
Abdeali Chandanwala

この遅延問題は、主にローカルホスト環境の中でまれに生産に起こっているところで-ドントノウハウ理由
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: hiddendisplay: none !important代わりに簡単な修正を使用することもできますが、他の方法で優先順位を確保するためのより良い解決策があることがよくあります。ここに代替案についての良い読み物があります


0

Angularバージョン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.