角度 ng-if 或 ng-show 响应缓慢(2 秒延迟?)

Posted

技术标签:

【中文标题】角度 ng-if 或 ng-show 响应缓慢(2 秒延迟?)【英文标题】:angular ng-if or ng-show responds slow (2second delay?) 【发布时间】:2015-01-12 07:38:35 【问题描述】:

当请求繁忙时,我试图在按钮上显示或隐藏加载指示器。我通过在加载请求或完成加载时更改 $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>

这工作正常,但加载图标(离子刷新)显示大约 2 秒,而 $scope 变量会立即更新。我试过 $scope.$apply 但这似乎不是问题所在,范围更新得很好,并且在请求之后立即更新。只是图标响应不够快。

【问题讨论】:

任何动画? 否定。不涉及动画。改用 ng-class 似乎有帮助。 我遇到了相同或类似的问题。范围会立即正确更新——我通过记录来自$scope 函数的消息来验证这一点,ng-if 使用这些函数来确定是否应显示相关元素。但是,带有ng-if 的按钮会在几秒钟内保持不正确的可见或隐藏状态。然后过了一会儿,所有按钮都进入预期的可见/隐藏状态。 — 我改用ng-hide 来解决这个问题。 Angular 版本 1.2.16。 对于那些不使用任何动画的人有什么解决办法吗? 【参考方案1】:

如果您没有在应用配置和 index.html 页面中使用 ngAnimate,请尝试删除它:

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

@Spock;如果您仍然需要使用 ngAnimate,请保持您的应用配置不变,只需添加以下 CSS:

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

这将在满足您的条件后立即隐藏动画图标。

如您所见,我们将 .ng-hide-animate 设置为隐藏。这就是在等待动画完成时导致延迟的原因。您可以按照类名的含义向 hide 事件添加动画,而不是像上面的示例中那样隐藏它。

【讨论】:

我有一个简单的页面,只有几个ng-ifng-show,这显然很慢。我删除了ngAnimate,它为我解决了这个问题。谢谢! 这也解决了我遇到的一个问题...你知道为什么 ngAnimate 的存在会导致过渡缓慢吗? 有同样的问题 - 删除 ngAnimate 解决了它.. 但这不好.. 许多模块需要 ngAnimate 来做很酷的动画.. 怎么办? ngAnimattias 你在哪里? :) ng-if 的情况下,只需将 .ng-leave display:none; 添加到元素中就可以了(不需要!important)。【参考方案2】:

我遇到了同样的问题,并通过使用带有“隐藏”类名的 ng-class 来隐藏元素而不是使用 ng-if 或 ng-show/ng-hide 来解决它。

【讨论】:

似乎与动画和/或事件处理程序有关。不太清楚为什么其他人很慢,但我想知道 你怎么能这样做? 这速度快多了!这是为什么呢?? 我认为这仅仅是因为使用 ngAnimate 将进入/退出动画行为应用于使用 ng-if/ng-show 的元素,而对于 ng-class 的更改却没有这样做表达式。 @neimad 这是怎么做到的?在我的例子中,我需要使用 ng-if 来测试一个属性值是否为null(等待 api 调用几秒钟),所以两个选择元素会短暂显示。所以你根本不使用ng-if 吗?谢谢。【参考方案3】:

我找到了一些解决方案 here,但对我来说最好的是覆盖 .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/

希望对你有帮助。

【讨论】:

【参考方案4】:

我遇到了类似的问题,我使用$scope.$evalAsync() 强制更新绑定。

它就像一个魅力。

避免使用$scope.$apply,因为它可能与已经运行的 $digest 阶段发生冲突。

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

【讨论】:

为我工作。但它有什么缺点吗? 我没遇到过。在异步操作的情况下它非常方便。 感谢您的帮助:) 顺便说一下,这个延迟问题主要发生在本地主机环境中,很少发生在生产环境中 - 不知道为什么【参考方案5】:

我在使用时遇到了同样的问题

<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

如果您的 CSS 中有 DIV 现有类的 display: flex,则该显示属性可能优先于 display: hidden。一个简单的解决方法是改用display: none !important,但通常有更好的解决方案以其他方式确保优先级。 Here is a good read about alternatives.

【讨论】:

【参考方案6】:

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


        

【讨论】:

【参考方案7】:

我最终使用了Ruben's solution,但因为我无法为所有现有案例添加额外的类,所以我列出了我一直使用的指令,没有动画,期望立即呈现:

*[ng-hide],
*[ng-show],
*[ng-if],
*[ng-switch-when],
*[ng-switch-default] 
  transition: 0s none;
  -webkit-transition: 0s none;
  animation: 0s none;
  -webkit-animation: 0s none;

【讨论】:

以上是关于角度 ng-if 或 ng-show 响应缓慢(2 秒延迟?)的主要内容,如果未能解决你的问题,请参考以下文章

Angular零星知识点2

ng-show与ng-if区别

ng-show和ng-if的区别(从别人博客摘取)

javascript Angular ng-show,ng-hide,ng-if,ng-switch

ng-if / ng-show/ng-hide ng-swith

angularjs笔记