考虑以下示例:
angular.module('app', []).controller('TestController', function($scope) {
$scope.getText = function() {
console.log('getting text');
return 'text';
};
}).filter('text', function() {
return function() {
console.log('text filter');
return 'text';
};
});

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script>
<div ng-app="app" ng-controller="TestController">
<p>{{getText()}}</p>
<p>{{'' | text}}</p>
</div>
&#13;
请注意,getText()
函数运行两次,而过滤器只运行一次。我假设getText()
函数运行两次以确保模型现在稳定。为什么过滤器的行为不一样?
答案 0 :(得分:5)
答案 1 :(得分:3)
Cosmin是完全正确的 - 这是一个演示来证明它(巧合的是,它会在某个时刻导致堆栈溢出) - 当调用getText()时,它会为输入分配一个新值。文本过滤器,导致它重新评估,这会导致另一个摘要周期,这会导致过滤器重新评估...这最终会导致堆栈溢出。
编辑我删除了导致溢出的测试部分 - 这只会让过滤器评估两次,因为只调用了两次getText。
angular.module('app', []).controller('TestController', function($scope) {
$scope.foo = 'bar';
$scope.getText = function() {
console.log('getting text');
$scope.foo += 'a';
return 'text';
};
}).filter('text', function() {
return function() {
console.log('text filter');
return 'text';
};
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script>
<div ng-app="app" ng-controller="TestController">
<p>{{getText()}}</p>
<p>{{foo | text}}</p>
</div>
&#13;
答案 2 :(得分:1)
当在模板中使用表达式时,AngularJS首先计算大括号内的材质/文本(插值),然后将值/输出转换为字符串,然后将此字符串值插入HTML元素/属性。
From AngularJS Docs:- 在模板中,过滤器仅在其输入已更改时执行。这比在每个$ digest上执行过滤器更有效,就像表达式一样。
此规则有两个例外:
答案 3 :(得分:0)
过滤器仅在输入已更改时执行。这比在每个
$digest
上执行过滤器更高效,就像表达式一样。此规则有两个例外:
通常,这仅适用于将原始值作为输入的过滤器。接收对象作为输入的过滤器将在每个
$digest
上执行,因为如果输入已更改,则跟踪成本太高。标记为
$stateful
的过滤器也会在每个$digest
上执行。有关详细信息,请参阅状态过滤器。请注意,没有AngularJS核心过滤器$stateful
。
由于您的原始值不会发生变化,因此过滤器不必再次执行。将空字符串''
更改为对象文字{}
,看看会发生什么;)
答案 4 :(得分:0)