AngularJS中的每个模型更改后都会触发ng show中的表达式吗?

AngularJS中的每个模型更改后都会触发ng show中的表达式吗?,angularjs,Angularjs,我有一个简单的控制器标记 <div ng-controller="TestCtrl" ng-show="isVisible()"> <input type="text" ng-model="smth"/><br> <span>{{smth}}</span> </div> 为什么在每一次小小的型号更改(例如,在文本框中更改一个字母)后,我都能看到控制台中运行着isVisible?在这种情况下这不是问题,但我

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

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

为什么在每一次小小的型号更改(例如,在文本框中更改一个字母)后,我都能看到控制台中运行着
isVisible
?在这种情况下这不是问题,但我认为它将在大规模应用中。我可以避免吗?

这是正常的,因为这是AngularJS如何发挥“魔力”的关键。这个答案有更多细节:


有不同的技术可以确保您不会遇到性能问题,但通常不能将这些表达式排除在计算之外。

Liviu t.是正确的。您无法避免在每次范围更改时执行
isVisible
函数。如果Angular没有重新运行此函数,则它可能与代码的其余部分不同步(例如,如果它使用
$scope.smth
model解析返回值)

考虑到这一点,您应该始终尝试使函数幂等/纯(对于相同的输入,始终返回相同的输出)和轻,因为指令(如ng hide、ng show、ng class和类似)将始终在每个$digest循环中重新计算分配给它们的表达式


现在,如果您真的不想让它再次执行,您可以尝试一些方法来缓存函数输出。

这是因为它是一个在$digest阶段非常有角度的函数,需要运行它来查看它是否已更改dit在这里也是幂等的(这是表达式中的一个重要属性,因为它可以防止由于模型不稳定而导致的错误)以及这些表达式应该快速计算的事实。
function TestCtrl($scope, $log)
{
    $scope.smth = 'smth';

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

        return true;
    }
}