AngularJS范围模式和范围方法
Here is my PlunkAngularJS范围模式和范围方法
我需要了解AngularJS如何处理范围变量,定范围的方法的一部分。
下面是我的控制器代码
var app = angular.module('plunker', []);
app.controller('MainCtrl', ["$scope", function($scope) {
$scope.name = "";
$scope.getNameLength = function(){
return $scope.name.length;
}
}]);
这里是我的html正文(只是保持我的简单的div)
<body ng-controller="MainCtrl">
<div>
Enter Your Name :<input type="text" ng-model="name">
<br>
{{ "Your entered name whoes length is = " + getNameLength() }}
</div>
</body>
由于,当我在文本框中输入内容时,getNameLength()
是调用DOM并更新以反映name
的长度。
只要指令中引用的方法在名称发生更改时调用该方法。
这里是我的疑问: 为什么角呼吁所有范围每当有视图模型的变化的方法(在指令中被引用)?是否可以禁用此行为?这有什么性能影响?
如果担心Angular调用方法的次数过多,并且想要限制执行,则始终可以使用ngModelOptions指令并传递去抖动。你可以看到文档on the AngularJS page。例如:
<input type="text" ng-model="name" ng-model-options="{debounce: 500}">
只有当模型停止更新500毫秒后,才会更新模型。你也可以使用类似ng-model-options="{updateOn: 'blur'}"
的东西来更新模型后,该领域失去了重点。
就性能而言,如果它像计算字符串的长度那样简单,那么您不应该担心太多。如果它比较复杂,可能会遇到问题。
每当视图模型发生变化时,为什么会角度调用范围内的所有方法(指令中引用的是 )?
我没有在您的示例中看到自定义指令,但Angular指令将从其父项继承范围属性,使用父范围或具有隔离范围。
如果您没有隔离范围,除非您覆盖它,否则它将在父级范围内查找该属性。因为你有一个Angular表达式({{和}}包围它),Angular为表达式中的任何内容创建了一个观察者。当它检测到监视的变量或对象已更改时,它将更新与之相关的所有内容。
是否可以禁用此行为?
是的,的确,正如您在您的问题的评论中提到的那样,您可以使用'一次性绑定'。
例子:
{{normalBinding}}
{{::oneTimeBinding}}
是否有此任何性能意味着什么呢?
是的,您拥有的绑定越多,观察者越多,摘要循环所需时间越长,您的应用程序所需的时间越长,以反映更改。这是大型应用程序所关注的问题。
有关范围和观察者的更多信息可以在here找到。
使用一次绑定'{{::' – YOU
不完全清楚你在问什么 – charlietfl
你需要了解Angular的摘要循环如何。有大量的信息。 – dfsq