我來自Knockout,我想了解Angular如何更新範圍。我有點困惑,爲什麼在範圍上定義的函數(例如$scope.doStuff = function()
)在每個範圍刷新上都被執行。爲什麼AngularJS在每個摘要循環上執行函數?
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中的函數會在每個範圍刷新上執行?
角度必須確保沒有改變視圖,因此它執行你在視圖內使用的所有函數,並且檢查視圖內是否使用了所有變量 – Grundy
因此,如果我有一個包含1000個項目的'ng-repeat',並且每個人都有一個'ng-show =「函數()」'這意味着每次更新文本字段時,Angular將執行該函數1000次?這似乎是糟糕的表現明智的。 – Andrew
所以不要使用它1000個項目:-) – Grundy