angularjs入門-module和controller

angularjs入門-module和controller

現在就直接來談談module吧,module是什麼東西呢?簡單來說這就像是一個模組,我在原文書看是稱為這就像一個packaging。總而言之是看各位怎麼去使用他,如果說我們今天做的是一套erp。我們可以分成會計模組,或者是財務模組。但有些人則是以程式功能性來分類,比如service或filter。現在就看看module怎麼使用吧。

首先我們就是在原本ng-app的地方多給他value。

 

 

image

 

然後我們就可以在javascript裡面寫這樣的語法

 

var app=angular.module('App', []);

 

如果我們要引用自己寫或third party的元件,我們可以像下面這樣

 

var app=angular.module('App',['App.service','App.filter','ui.bootstrap']);

 

這種方式,可以很容易讓我們定出很容易歸納的模組分辨。有在寫javascript的人,應該都很清楚全域是一種另人很頭痛的地方。尤其是越多人同時開發,這種狀況會更明顯。

在來就是controller的部份了,我們可以寫下面這樣的語法

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        <input type="text" ng-model="hello" class="form-control" />
        {{hello}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                $scope.hello = "Hello Anson";
            });
    </script>
</body>
</html>

 

我們在controller裡面給了hello的值,所以input的欄位,預設就會有我們在controller裡面的值。

script的部份也可以寫成像下面這樣的語法

    var app=angular.module('App', []);
    app.controller('FirstCtrl', function ($scope) {
        $scope.hello = "Hello Anson";
    });

 

注意一下,controller裡面的值只會在自己的範圍內生效,這也很大的解決了我們全域的問題。比如像下面這樣子的範例,只能存取各自的內容,不會影響到別的區域,比如像下

面的範例。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        <input type="text" ng-model="hello" class="form-control" />
        {{hello}}
    </div>
    <hr />
    <div ng-controller="SecondCtrl">
        <input type="text" ng-model="hello" class="form-control" />
        {{hello}}
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                $scope.hello = "Hello Anson";
            })
            .controller('SecondCtrl', function ($scope) {
                $scope.hello = "Hello man";
            })
    </script>
</body>
</html>

image

 

controller也有繼承的問題,我們只需要使用巢狀的controller就可以有繼承的觀念。我們可以看看像下面這樣子的範例

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        <input type="text" ng-model="hello" class="form-control" />
        {{hello}}
        <br />
        {{test}}
        <hr />
        <div ng-controller="SecondCtrl">
            <input type="text" ng-model="test" class="form-control" />
            {{hello}}
            <br />
            {{test}}
        </div>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                
            })
            .controller('SecondCtrl', function ($scope) {
                
            });
    </script>
</body>
</html>
    

 

基本上FirstCtrl不能使用SecondCtrl範例的內容,但SecondCtrl卻可以使用到FirstCtrl的。但是如果巢狀的Controller使用一樣的變數呢??這樣子的話在父Ctrl輸入的時候會影響到子類別的,然後子類別輸入之後,就又都各自作業了,這很容易造成豆相干擾,用說明的很難懂,直接看DEMO實際操作比較清楚

如下面的範例

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl">
        <input type="text" ng-model="hello" class="form-control" />
        {{hello}}
        <hr />
        <div ng-controller="SecondCtrl">
            <input type="text" ng-model="hello" class="form-control" />
            {{hello}}
        </div>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                
            })
            .controller('SecondCtrl', function ($scope) {
                
            });
    </script>
</body>
</html>
    

DEMO

 

所以現在很多大師們都比較推像下面這樣的語法,這樣就算有一樣的變數,也不會互相干擾,這也可以稱為是controllerAs

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
</head>
<body ng-app="App">
    <div ng-controller="FirstCtrl as firstCtrl">
        <input type="text" ng-model="firstCtrl.hello" class="form-control" />
        {{firstCtrl.hello}}
        <hr />
        <div ng-controller="SecondCtrl as secondCtrl">
            <input type="text" ng-model="secondCtrl.hello" class="form-control" />
            {{secondCtrl.hello}}
        </div>
    </div>

    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <script>
        angular.module('App', [])
            .controller('FirstCtrl', function ($scope) {
                var self = this;
                self.hello = "Hello Anson";
            })
            .controller('SecondCtrl', function ($scope) {
                var self = this;
                self.hello = "Hello Kin";
            });
    </script>
</body>
</html>
    

DEMO

 

至於怎樣的做法比較好,就看團隊的定義,有些人強調controller做的事情要單一,在下比較認為盡量不要使用巢狀controller的方式,我個人覺得可讀性會比較差,而且也會間接讓程式碼變得越來越複雜,但如果界面越來越複雜的話呢?當然每個人都有自己的見解來規劃架構,為了不離題,這邊的討論先到這邊。

 

以上的內容再請大家指教。