在AngularJS中的每个模型更改后,ng-show中的表达式被触发了吗?

Vit*_*kov 3 angularjs

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

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

和控制器本身

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

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

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*wie 5

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

考虑到这一点,你应该总是尝试使你的函数幂等/纯(在给定相同输入的情况下总是返回相同的输出)和光,因为诸如ng-hide,ng-show,ng-class和类似的指令将始终重新 - 在每个$ digest周期中评估分配给它们的表达式.

现在,如果您真的不希望它再次执行,您可以尝试一些用于缓存函数输出的memoization技术.