AngularJS。阻止更新$ scope中的所有数据

时间:2017-05-06 20:51:59

标签: angularjs angularjs-scope

我是Angular的新手,我有一个问题 我注意到,角度更新视图上的所有范围数据(我是对的吗?),即使它只更改了一个变量(在视图上呈现)。这是正常的吗?如果我在视图上有大量数据并且只想在更改数据时更新它,该怎么办呢?

代码例如(每次执行scope.word时,函数func正在执行):

    <div ng-app="myApp" ng-controller="myCtrl">
        Word: <input ng-model="word">
        {{func()}}
    </div>

    <script>
      var app = angular.module('myApp', []);
      app.controller('myCtrl', function($scope) {
         $scope.word = "John Doe";
         $scope.func = function(){
         alert("Who dared to disturb me !? >(");
       };
   });
   </script>

1 个答案:

答案 0 :(得分:2)

这是正常的吗? - 你打赌这是正常的,这是整个想法。

你正在做的事情根本不是一个好习惯,因为当你在视图中将一个函数绑定为表达式时,angular不会“知道”何时应该更新视图中的表达式,所以它会更新它每个消化周期都会发生很多!几乎每次用户与视图交互(单击,滚动)或控制器端的任何内容都发生了变化,因此您可能会发现自己最终只有this error

您应该将属性绑定到视图,不是函数。例如:

angular.module('app',[]).controller('ctrl', function($scope) {
  $scope.welcomeMessage = "Hi, welcome to AngularJS!";
  
  $scope.updateMessage = function(message) {
    $scope.welcomeMessage = message;
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="ctrl">
  <strong>{{ welcomeMessage }}</strong>
  
  <hr>
  
  
  <input type="text" ng-model="msg">
  <button ng-click="updateMessage(msg)">Update Message</button>
</div>

请注意,如果知道您需要在视图中绑定一次属性,那么您可以使用一次性绑定

  <strong>{{ ::welcomeMessage }}</strong>

  <strong ng-bind="::welcomeMessage"></strong>

通过向表达式添加::,可以防止角度在第一次绑定到视图后跟踪此表达式,并且不会再次更新它,在控制器上更改了它的事件,这是适合您的应用程序的性能,并可以显着改善它们。

以下是一次性绑定的一个工作示例:https://jsfiddle.net/hu9zcbwh/2/(我无法创建stack-snippet,因为它没有角度1.3,这个未来是第一次引入的)

我正在使用更明确的@MaximShoustin评论编辑此内容,并更好地总结普通绑定和一次绑定之间的差异:

ng-bind{{}}会生成一个观察者,并会在每个摘要周期后触发。另一方面,::表达式创建观察者并在值不是undefined

时取消它

对不起,不是以英语为母语的人:(