AngularJS 作用域

作用域(Scope)是 HTML(视图)和 JavaScript(控制器)之间的绑定部分。

作用域是一个具有可用属性和方法的对象。

作用域可用于视图和控制器。


如何使用作用域?

在 AngularJS 中创建控制器时,将 $scope 对象作为参数传递:

实例

在控制器中创建的属性,可以在视图中引用:

  1. <!DOCTYPE html>
  2. <html>
  3. <script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
  4. <body>
  5. <div ng-app="myApp" ng-controller="myCtrl">
  6. <h2>{{carname}}</h2>
  7. </div>
  8. <script>
  9. var app = angular.module('myApp', []);
  10. app.controller('myCtrl', function($scope) {
  11. $scope.carname = "Volvo";
  12. });
  13. </script>
  14. <p>属性 "carname" 是在控制器中创建的,可以在视图中使用 {{ }} 括号进行引用。</p>
  15. </body>
  16. </html>

向控制器中的 $scope 对象添加属性时,视图(HTML)可以访问这些属性。

在视图中,不使用前缀 $scope,只引用属性名,比如 {{carname}}


理解作用域

如果我们认为 AngularJS 包括以下(MVC):

  • 视图,即 HTML。
  • 模型,它是当前视图可用的数据。
  • 控制器,这是一个 JavaScript 函数,用于生成/更改/删除/控制数据。

那么作用域 scope 就相当于模型 model。

作用域是一个JavaScript对象,具有属性和方法,可用于视图和控制器。

实例

如果在视图中进行更改,模型和控制器将更新:

  1. <!DOCTYPE html>
  2. <html>
  3. <script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
  4. <body>
  5. <div ng-app="myApp" ng-controller="myCtrl">
  6. <input ng-model="name">
  7. <h2>My name is {{name}}</h2>
  8. </div>
  9. <script>
  10. var app = angular.module('myApp', []);
  11. app.controller('myCtrl', function($scope) {
  12. $scope.name = "John Doe";
  13. });
  14. </script>
  15. <p>在输入字段中更改名称时,这些更改将影响模型,还将影响控制器中的 name 属性。</p>
  16. </body>
  17. </html>

了解你的作用域

It is important to know which scope you are dealing with, at any time.

In the two examples above there is only one scope, so knowing your scope is not an issue, but for larger applications there can be sections in the HTML DOM which can only access certain scopes.

随时了解你要处理的作用域是很重要的。

在上面的两个示例中,只有一个作用域,因此了解您的作用域不是问题,但是对于更大的应用程序,HTMLDOM 中可能有只能访问特定作用域的部分。

实例

在处理 ng-repeat 指令时,每个 repeat 都可以访问当前 repeat 对象:

  1. <!DOCTYPE html>
  2. <html>
  3. <script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
  4. <body>
  5. <div ng-app="myApp" ng-controller="myCtrl">
  6. <ul>
  7. <li ng-repeat="x in names">{{x}}</li>
  8. </ul>
  9. </div>
  10. <script>
  11. var app = angular.module('myApp', []);
  12. app.controller('myCtrl', function($scope) {
  13. $scope.names = ["Emil", "Tobias", "Linus"];
  14. });
  15. </script>
  16. <p>变量 "x" 对于每个 repeat 都有不同的值,证明每个 repeat 都有自己的作用域。</p>
  17. </body>
  18. </html>

每个 <li> 元素都可以访问当前的 repeat 对象,在本例中是一个字符串,使用 x 来引用它。


根作用域

所有应用程序都有一个 $rootScope,它是在包含 ng-app 指令的 HTML 元素上创建的作用域。

rootScope 在整个应用程序中都可用。

如果变量在当前作用域和根作用域中具有相同的名称,则应用程序将使用当前作用域中的名称。

实例

A variable named "color" exists in both the controller’s scope and in the rootScope:

  1. <!DOCTYPE html>
  2. <html>
  3. <script src="https://cdn.bootcdn.net/ajax/libs/angular.js/1.8.2/angular.min.js"></script>
  4. <body ng-app="myApp">
  5. <p>rootScope 最喜欢的颜色:</p>
  6. <h2>{{color}}</h2>
  7. <div ng-controller="myCtrl">
  8. <p>控制器最喜欢颜色的作用域:</p>
  9. <h2>{{color}}</h2>
  10. </div>
  11. <p>rootScope 最喜欢的颜色依然是:</p>
  12. <h2>{{color}}</h2>
  13. <script>
  14. var app = angular.module('myApp', []);
  15. app.run(function($rootScope) {
  16. $rootScope.color = 'blue';
  17. });
  18. app.controller('myCtrl', function($scope) {
  19. $scope.color = "red";
  20. });
  21. </script>
  22. <p>请注意,控制器的颜色变量不会覆盖 rootScope 的颜色值。</p>
  23. </body>
  24. </html>

分类导航