1. 程式人生 > >MVC5開發前端框架AngularJS快速入門之Controller

MVC5開發前端框架AngularJS快速入門之Controller

先看看AngularJS官方對Controller的解釋

在Angular中,控制器就像 JavaScript 中的建構函式一般,是用來增強 Angular作用域(scope) 的。

當一個控制器通過 ng-controller 指令被新增到DOM中時,ng 會呼叫該控制器的建構函式來生成一個控制器物件,這樣,就建立了一個新的子級 作用域(scope)。在這個建構函式中,作用域(scope)會作為$scope引數注入其中,並允許使用者程式碼訪問它。

一般情況下,我們使用控制器做兩件事:

  • 初始化 $scope 物件
  • 為 $scope 物件新增行為(方法)

c從這個解釋中可以看出,在angularJS中Controller是有作用域的,它的作用域就是它所附加的DOM標籤域,其次Controller是為域物件$scope提供物件及方法,從而實現它所在的作用域內的DOM標籤的雙向繫結或事件處理。看個簡單例子:

 <div class="col-md-3" id="login" ng-controller="LoginCtrl">
                <div class="panel panel-primary">
                    <div class="panel-heading">
                        <div class="panel-title">
                            <h5>使用者登入</h5>
                        </div>
                    </div>
                    <div class="panel-body">
                        <div class="form-group">
                            <label class="control-label">使用者名稱</label>
                            <input type="text" class="form-control" ng-model="UserInfo.UserName" />
                        </div>
                        <div class="form-group">
                            <label class="control-label">密碼</label>
                            <input type="password" class="form-control" ng-model="UserInfo.Password" />
                        </div>
                        <div class="form-group">
                            <button class="btn btn-primary" ng-click="Login()">登入</button>
                        </div>


                    </div>
                </div>


在這個div中定義了一個LoginCtrl的控制器,那麼這個控制器的作用域即是id=login的div。在上面的這段html中可以看出LoginCtrl包含了一個名為UserInfo的物件,這個物件包含了UserName,Password屬性,同時在LoginCtrl中還包含了 一個Login的方法 。下面看看具體的程式碼 :

var loginApp = angular.module("loginApp", []);
loginApp.controller('LoginCtrl', function ($scope, $http) {
    $scope.UserInfo={
        UserName:"admin",
        Password:"admin"
    }
    $scope.Login=function() {
        $http.post('/account/login', $scope.UserInfo).success(function (data,status) {
            console.log('登入成功');
        }).error(function (data,status) {
            console.log('登入失敗');
        });
        
    }
});
從上面程式碼可以看出,controller設計也是基於模組的,每個Controller都必須由一個模組來進行建立。

上面 的 Controller的建立的第一引數是Controller的名稱,後面的functions是它個一個建構函式,因為這個congroller需要使用$scope,$http,所以這個建構函式注入了兩個angular的服務,如果有自定義的服務需要使用也需要在建構函式中進行注入,還有另外一種建立Controller的方式如下:

loginApp.controller('LoginCtrl',['$scope','$http',function($scope,$http){....}])

這種方式第一個引數還是Controller名稱,後面跟這一個陣列,在陣列中前面是該Controller需要使用的服務依賴,最後是Controller的構造。

在這個Controller中我們定義了一個物件和一個方法,注意這裡都是在$scope中進行定義,這就能理解官方說的是$scope的增強了。

最後,關於Controller的擴充套件和複用,按照官方的說法,每一個Controller對應一個view,如果有多個Controller使用相同內容時需要考慮將相同的部分抽像成服務,然後在Controller中呼叫這個服務從而實現對Controller的擴充套件。具體實現下面再進一步記錄。