【问题标题】:Is expression inside ng-show fired after every model change in AngularJS?AngularJS 中的每次模型更改后是否会触发 ng-show 中的表达式?
【发布时间】:2013-03-03 19:20:34
【问题描述】:

我有这个简单的控制器标记

<div ng-controller="TestCtrl" ng-show="isVisible()">
    <input type="text" ng-model="smth"/><br>
    <span>{{smth}}</span>
</div> 

还有控制器本身

function TestCtrl($scope, $log)
{
    $scope.smth = 'smth';

    $scope.isVisible = function(){
        $log.log('isVisible is running');

        return true;
    }
}

为什么每次更改模型后(例如更改文本框中的一个字母)我可以在控制台中看到isVisible is running?这种情况没问题,但我认为它会在大型应用中。我可以避免这种情况吗?

【问题讨论】:

  • 因为它是一个函数,所以在 $digest 阶段需要运行它来查看它是否发生了变化

标签: angularjs


【解决方案1】:

Liviu T. 是对的。您无法避免在每次范围更改时执行 isVisible 函数。如果 Angular 没有重新运行这个函数,那么它可能会与其余代码不同步(例如,如果它使用 $scope.smth 模型来解析返回值)。

考虑到这一点,您应该始终尝试使您的函数具有幂等性/纯(总是在给定相同输入的情况下返回相同的输出)并且轻量级,因为诸如 ng-hide、ng-show、ng-class 和类似指令之类的指令将始终在每个 $digest 循环中重新评估分配给它们的表达式。

现在,如果您真的不希望它再次执行,您可以尝试使用 the memoization techniques 来缓存函数输出。

【讨论】:

  • 这里的幂等性(这是表达式中的重要属性,因为它可以防止由于模型不稳定而导致的错误)以及这些表达式应该评估 fast.
【解决方案2】:

这是正常的,因为这是 AngularJS 如何发挥其“魔力”的重要部分。这个答案有更多细节:https://stackoverflow.com/a/9693933/1418796

有不同的技术可以确保您不会遇到性能问题,但没有,通常您不能排除这些表达式被评估。

【讨论】:

    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多