这是我的普伦克
我需要了解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的长度。
只要在指令中引用的方法,只要名称发生更改,就会调用该方法。
这里是我的疑问:当视图模型发生变化时,为什么要对范围中的所有方法进行角调用(在指令中是引用的)?可以禁用此行为吗?这是否对性能有任何影响?
发布于 2015-10-06 15:55:51
如果您担心Angular多次调用您的方法,并且希望限制执行,那么您可以始终使用ngModelOptions指令并传递退出命令。您可以看到文档在AngularJS页面上。例如:
<input type="text" ng-model="name" ng-model-options="{debounce: 500}">只有在模型停止更新500毫秒后才会更新模型。您还可以使用像ng-model-options="{updateOn: 'blur'}"这样的工具,只在字段失去焦点之后才更新模型。
就性能而言,如果它很简单,比如计算字符串的长度,那么您就不必担心太多了。如果是更复杂的事情,你可能会遇到问题。
发布于 2015-10-06 17:08:45
当视图模型发生变化时,为什么要对作用域中的所有方法(在指令中引用的方法)进行角度调用?
在您的示例中,我没有看到一个自定义指令,但是角指令要么继承其父范围的范围属性,要么使用父作用域,要么具有隔离作用域。
如果您没有隔离作用域,它将查找父作用域中的属性,除非您重写它。
因为您有一个角表达式({和}包围它),因此角可以对表达式中的任何内容进行观察。当它检测到一个被监视的变量或对象已经改变时,它将更新所有依赖于它的东西。
可以禁用此行为吗?
是的,的确,正如“你”在对你的问题的评论中提到的,你可以使用“一次绑定”。
示例:
{{normalBinding}}
{{::oneTimeBinding}}这是否对性能有任何影响?
是的,绑定越多,观察者越多,摘要周期越长,应用程序反映变化的时间就越长。这是对大型应用程序的关注。
有关范围和观察者的更多信息可以找到这里。
https://stackoverflow.com/questions/32973400
复制相似问题