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 วินาทีในขณะที่ตัวแปร $ ขอบเขตจะได้รับการอัปเดตทันที ฉันลองใช้ $ ขอบเขต $ ใช้ แต่ดูเหมือนว่าจะไม่มีอะไรผิดปกติที่นี่ขอบเขตได้รับการอัปเดตอย่างดีและทันทีหลังจากการร้องขอ เป็นเพียงไอคอนที่ไม่ตอบสนองเร็วพอ

ขอบคุณที่ช่วยให้ฉันเข้าใจเรื่องนี้!


2
มีภาพเคลื่อนไหวที่เกี่ยวข้องหรือไม่?
tasseKATT

เชิงลบ ไม่มีภาพเคลื่อนไหวที่เกี่ยวข้อง การใช้ ng-class แทนดูเหมือนจะช่วยได้

ฉันมีปัญหาเดียวกันหรือคล้ายกัน ขอบเขตได้รับการอัปเดตทันทีและถูกต้อง - ฉันตรวจสอบสิ่งนี้โดยบันทึกข้อความจากการใช้$scopeฟังก์ชันที่ng-ifใช้เพื่อดูว่าควรแสดงองค์ประกอบที่เกี่ยวข้องหรือไม่ อย่างไรก็ตามปุ่มที่ng-ifมองไม่เห็นไม่ถูกต้องหรือซ่อนไว้สักครู่ หลังจากนั้นไม่นานปุ่มทั้งหมดจะใช้สถานะที่มองเห็นได้ / ซ่อนอยู่ตามที่ตั้งใจไว้ - ฉันแก้ไขสิ่งนี้โดยใช้ng-hideแทน Angular รุ่น 1.2.16.2
KajMagnus

วิธีแก้ปัญหาสำหรับผู้ที่ไม่ได้ใช้ภาพเคลื่อนไหวใด ๆ ?
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-ifหน้าng-showซึ่งช้าอย่างเห็นได้ชัด ฉันลบออกngAnimateและมันช่วยแก้ปัญหาให้ฉันได้ ขอบคุณ!
Eamonn Gahan

1
สิ่งนี้ช่วยแก้ปัญหาที่ฉันพบได้เช่นกัน ... คุณรู้หรือไม่ว่าเหตุใดการมี ngAnimate จึงทำให้การเปลี่ยนแปลงช้า
Clark

มีปัญหาเดียวกัน - การลบ ngAnimate แก้ไขได้ .. แต่นี่ไม่ดี .. หลายโมดูลต้องใช้ ngAnimate เพื่อทำภาพเคลื่อนไหวที่ยอดเยี่ยม .. จะทำอย่างไร? ngAnimattias คุณอยู่ที่ไหน :)
Spock

21
ในกรณีของng-ifการเพิ่มเพียงแค่.ng-leave { display:none; }องค์ประกอบก็เป็นเคล็ดลับสำหรับฉัน ( !importantไม่จำเป็น)
Joao

40

ฉันมีปัญหาเดียวกันและแก้ไขปัญหานี้โดยใช้ ng-class ที่มีชื่อคลาส 'hidden' เพื่อซ่อนองค์ประกอบแทนที่จะใช้ ng-if หรือ ng-show / ng-hide


1
ดูเหมือนจะเกี่ยวข้องกับภาพเคลื่อนไหวและ / หรือตัวจัดการเหตุการณ์ ไม่แน่ใจจริงๆว่าทำไมคนอื่นถึงช้า แต่ฉันอยากรู้
Thiago Festa

1
คุณจะทำอย่างไร
jsmedmar

เร็วกว่านี้มาก! ทำไมเป็นแบบนี้ ??
Aron

1
ฉันคิดว่านี่เป็นเพียงความจริงที่ว่าการใช้ ngAnimate ใช้พฤติกรรมการเข้า / ออกของแอนิเมชั่นกับองค์ประกอบโดยใช้ ng-if / ng-show ในขณะที่มันไม่ได้ทำเช่นนั้นสำหรับการเปลี่ยนแปลงในนิพจน์ ng-class
John Rix

@neimad เป็นอย่างไรบ้าง? ในกรณีของฉันฉันต้องใช้ ng-if เพื่อทดสอบว่าค่าคุณสมบัติเป็นหรือไม่null(ซึ่งเป็นเวลาสองสามวินาทีที่รอการเรียก API) ดังนั้นองค์ประกอบที่เลือกสองรายการจึงแสดงสั้น ๆ คุณไม่ใช้ng-if เลยเหรอ? ขอบคุณ.
ริส

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เนื่องจากอาจขัดแย้งกับขั้นตอน $ แยกย่อยที่ทำงานอยู่แล้ว

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

ทำงานให้ฉัน แต่มันมีข้อเสียอะไรไหม?
Sarah Tammam

1
ฉันไม่พบอะไรเลย มีประโยชน์มากในกรณีของการดำเนินการ async
rach8garg

1
ขอบคุณสำหรับคำตอบที่เป็นประโยชน์ :)
Sarah Tammam

อย่างไรก็ตามปัญหาล่าช้านี้ส่วนใหญ่เกิดขึ้นในสภาพแวดล้อม localhost และไม่ค่อยมีการผลิต - ไม่รู้ว่าทำไม
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: flexใน CSS ของคุณสำหรับคลาส DIV ที่มีอยู่คุณสมบัติการแสดงผลนั้นอาจมีความสำคัญเหนือกว่า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.