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的长度。

只要指令中引用的方法在名称发生更改时调用该方法。

这里是我的疑问: 为什么角呼吁所有范围每当有视图模型的变化的方法(在指令中被引用)?是否可以禁用此行为?这有什么性能影响?

+0

使用一次绑定'{{::' – YOU

+0

不完全清楚你在问什么 – charlietfl

+0

你需要了解Angular的摘要循环如何。有大量的信息。 – dfsq

如果担心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找到。