【发布时间】:2015-06-11 00:54:37
【问题描述】:
我来自 Knockout,我正在尝试了解 Angular 如何更新范围。我有点困惑,为什么在作用域上定义的函数(例如$scope.doStuff = function())会在每次作用域刷新时执行。
Plnkr 链接:http://plnkr.co/edit/YnvOELGkRbHOovAWPIpF?p=preview
例如:
HTML
<div ng-controller="one">
<input type="text" ng-model="a">
{{b()}}
</div>
JS
angular.module('test', [])
.controller('one', ['$scope', function ($scope) {
$scope.a = 'one';
$scope.b = function () {
console.log('b has executed');
}
}])
因此,每当$scope.a 的输入表单字段中发生事件时,就会执行函数$scope.b。为什么会这样?该函数没有任何依赖关系,总是刷新似乎效率低下。
如果我在相同的结构中添加另一个控制器,如下所示:
HTML
<div ng-controller="one">
<input type="text" ng-model="a">
{{b()}}
</div>
<div ng-controller="two">
<input type="text" ng-model="x">
{{y()}}
</div>
JS
angular.module('test', [])
.controller('one', ['$scope', function ($scope) {
$scope.a = 'one';
$scope.b = function () {
console.log('b has executed');
}
}])
.controller('two', ['$scope', function ($scope) {
$scope.x = 'two';
$scope.y = function () {
console.log('y has executed');
}
}])
每次我在控制器one 中更新$scope.a 时,输出为:
b has executed
y has executed
为什么控制器two 执行$scope.y?我认为创建一个新控制器会创建一个新的子范围。是不是因为子作用域链接到父作用域?
更有趣的是,如果我在控制器 two 中更新 $scope.x,则输出为:
b has executed
y has executed
b has executed <-- a second time... what?
为什么函数$scope.b 会再次执行?
那么为什么 Angular 中的函数会在每次范围刷新时执行?
【问题讨论】:
-
angular 必须确保没有改变视图,所以它会执行你在视图中使用的所有函数,并检查是否所有在视图中使用的变量
-
所以如果我有一个包含 1000 个项目的
ng-repeat,并且每个项目都有一个ng-show="function()",这意味着每次我更新一个文本字段时,Angular 都会执行该函数 1000 次?这在性能方面似乎很糟糕。 -
所以不要将它与 1000 个项目一起使用 :-)
-
哦,所以不要使用Angular.JS?好,知道了。 :P
-
如果您可以提供您尝试的示例,我们可能会帮助您减少项目或函数调用。此外,如果您的一个参数集的函数只能返回一个常量值,您可以使用 memoization:保存具体参数的结果函数,如果参数未更改则返回它
标签: javascript angularjs knockout.js scope angularjs-scope