3

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

<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在控制台中看到?这种情况没有问题,但我认为它会在大型应用中。我可以避免这种情况吗?

4

2 回答 2

5

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

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

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

于 2013-03-03T19:48:10.377 回答
3

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

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

于 2013-03-03T19:42:58.070 回答