範圍的重要性

由於 Angular 使用 HTML 擴充套件網頁和普通 Javascript 來新增邏輯,因此可以使用 ng-appng-controller 和一些內建指令(如 ng-ifng-repeat 等) 輕鬆建立網頁。使用新的控制器語法,Angular 使用者的新手可以將功能和資料附加到他們的控制器,而不是使用 $scope

但是,遲早,重要的是要了解這個東西到底是什麼。它將不斷出現在示例中,因此瞭解一些內容非常重要。

好訊息是它是一個簡單而強大的概念。

建立以下內容時:

<div ng-app="myApp">
 <h1>Hello {{ name }}</h1>
</div>

哪裡住?

答案是 Angular 建立了一個 $rootScope 物件。這只是一個常規的 Javascript 物件,因此 name$rootScope 物件上的一個屬性:

angular.module("myApp", [])
  .run(function($rootScope) {
    $rootScope.name = "World!";
  });

就像 Javascript 中的全域性範圍一樣,將專案新增到全域性範圍或 $rootScope 通常不是一個好主意。

當然,在大多數情況下,我們建立一個控制器並將我們所需的功能放入該控制器中。但是當我們建立一個控制器時,Angular 會發揮它的魔力併為該控制器建立一個 $scope 物件。這有時被稱為本地範圍

所以,建立以下控制器:

<div ng-app="myApp">
  <div ng-controller="MyController">
    <h1>Hello {{ name }}</h1>
  </div>
</div>

允許通過 $scope 引數訪問本地範圍。

angular.module("myApp", [])
  .controller("MyController", function($scope) {
    $scope.name = "Mr Local!";
  });

沒有 $scope 引數的控制器可能由於某種原因根本不需要它。但重要的是要意識到,即使使用 controllerAs 語法,也存在本地範圍。

由於 $scope 是一個 JavaScript 物件,因此 Angular 神奇地將其設定為原型繼承自 $rootScope。正如你可以想象的那樣,可以有一系列範圍。例如,你可以在父控制器中建立模型,並將其作為 $scope.model 附加到父控制器的作用域。

然後通過原型鏈,子控制器可以使用 $scope.model 在本地訪問相同的模型。

這一切都不是最初明顯的,因為它只是 Angular 在背景中發揮其魔力。但瞭解 $scope 是瞭解 Angular 如何工作的重要一步。