控制器在Angularjs中的作用是增強視圖,它實際就是一個函數,用來向視圖中的範圍添加額外的功能,我們用它來給範圍對象設定初始狀態,並添加自訂行為。
當我們在頁面上建立一個控制器時,Angularjs會產生並傳遞一個$scope給這個控制器,由於Angularjs會自動執行個體化控制器,所以我們只需要寫建構函式即可。下面的例子展示了控制器初始化:
function my Controller($scope){ $scope.msg="hello,world!"; }
上面這個建立控制器的方法會汙染全域命名空間,更合理的辦法是建立一個模組,然後在模組中建立控制器,如下:
var myApp=angular.module("myApp",[]);myApp.controller("myController",function($scope){ $scope.msg="hello,world!";})
用內建指令ng-click可以將按鈕、連結等其他任何DOM元素同點擊事件進行綁定。ng-click指令將瀏覽器中的mouseup事件,同設定在DOM元素上的事件處理常式綁定在一起(例如,當瀏覽器在某個DOM元素上觸發了點擊事件,函數就會被調用)。和前面的例子類似,綁定看起來是這樣的:
<div ng-controller="FirstController"><h4>The simplest adding machine ever</h4><button ng-click="add(1)" class="button">Add</button><a ng-click="subtract(1)" class="button alert">Subtract</a><h4>Current count: {{ counter }}</h4></div>
按鈕和連結都被綁定在了內部$scope的一個操作上,當點擊任何一個元素時AngularJS都會調用相應的方法。注意,當設定調用哪個函數時,會同時用括弧傳遞一個參數(add(1))
app.controller('FirstController', function($scope) {$scope.counter = 0;$scope.add = function(amount) { $scope.counter += amount; };$scope.subtract = function(amount) { $scope.counter -= amount; };});
Angularjs與其他架構的最大區別在於,控制器並不適合來執行DOM操作、格式化或資料操作,以及除儲存資料模型之外的狀態維護操作,它只是視圖和$scope之間的橋樑。
控制器嵌套(範圍包含範圍)
AngularJS應用的任何一個部分,無論它渲染在哪個上下文中,都有父級範圍存在。對於ng-app所處的層級來講,它的父級範圍就是$rootScope。
預設情況下,AngularJS在當前範圍中無法找到某個屬性時,便會在父級範圍中進行尋找。如果AngularJS找不到對應的屬性,會順著父級範圍一直向上尋找,直到抵達$rootScope為止。如果在$rootScope中也找不到,程式會繼續運行,但視圖無法更新。
通過例子來看一下這個行為。建立一個ParentController,其中包含一個user對象,再建立一個ChildController來引用這個對象:
app.controller('ParentController', function($scope) {$scope.person = {greeted: false};});app.controller('ChildController', function($scope) {$scope.sayHello = function() {$scope.person.name = 'Ari Lerner';};});
如果我們將ChildController置於ParentController內部,那ChildController的$scope對象的父級範圍就是ParentController的$scope對象。根據原型繼承的機制,我們可以在子範圍中訪問ParentController的$scope對象。
<div ng-controller="ParentController"><div ng-controller="ChildController"><a ng-click="sayHello()">Say hello</a></div>{{ person }}</div>
以上就是本文的全部內容,希望對大家的學習有所協助,協助大家熟悉AngularJS控制器。