歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

AngularJS開發指南8:AngularJS模塊的詳解

在講angularjs的模塊之前,我們先介紹一下angular的一些知識點:

AngularJS是純客戶端技術,完全用Javascript編寫的。它使用的是網頁開發的常規技術(HTML,CSS,Javascript),目的是讓網頁應用開發更快更容易。

AngularJS簡化應用開發的一個重要方法是,將一個些通用的低級開發操作包裝起來提供給開發者。AngularJS會自動處理好這些低級操作。它們包括:

  • DOM操作
  • 設置事件的監聽
  • 輸入驗證,因為AngularJS會處理大部分這些操作,所以開發者就能更多的專注在應用的業務邏輯上,更少地編寫那些重復性的、易錯的、低級的代碼。

在AngularJS簡化開發的同時,它也為客戶端帶來了一些精巧的技術,它們包括:

  • 數據、業務邏輯、視圖的分離
  • 數據和視圖的自動綁定
  • 通用服務
  • 依賴注入(主要用於聚合服務)
  • 可擴展的HTML編譯器(完全由JavaScript編寫)
  • 易於測試

客戶端對這些技術的需求其實已經存在很久了。

同時,你還可以用AngularJS來開發單頁或者多頁的應用,不過其主要還是用來開發單頁的。 AngularJS支持浏覽器的歷史操作,向前,向後按鈕,單頁應用中的收藏操作。

接下來,我們來詳細講解angularJS的模塊。

大部分應用都有一個主方法用來實例化、組織、啟動應用。AngularJS應用沒有主方法,而是使用模塊來聲明應用應該如何啟動。這種方式有以下幾個優點:

  • 啟動過程是聲明式的,所以更容易懂。
  • 在單元測試是不需要加載全部模塊的,因此這種方式有助於寫單元測試。
  • 可以在特定情況的測試中增加額外的模塊,這些模塊能更改配置,能幫助進行端對端的測試。
  • 第三方代碼可以打包成可重用的模塊。
  • 模塊可以以任何先後或者並行的順序加載(因為模塊的執行本身是延遲的)。

舉個例子:

<!doctype html>
<html ng-app="myApp">
  <head>
    <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>
    <script>
           var myAppModule = angular.module('myApp', []);
      // configure the module.
      // in this example we will create a greeting filter
      myAppModule.filter('greet', function() {
         return function(name) {
              return 'Hello, ' + name + '!';
          };
      });
    </script>
  </head>
  <body>
    <div>
      {{ 'World' | greet }}
    </div>
  </body>
</html>
 

上面的例子,我們是通過在<html ng-app="myApp">中進行指定,來實現使用myApp這個模塊啟動應用的。

以上這個例子寫法很簡單,但是不適合用同樣的寫法來寫大型應用。我們推薦是將你的應用拆分成以下幾個模塊:

  • 一個服務模塊,用來做服務的聲明。
  • 一個指令模塊,用來做指令的聲明。
  • 一個過濾器模塊,用來做過濾器聲明。
  • 一個依賴以上模塊的應用級模塊,它包含初始化代碼。

舉個例子:

<!doctype html>
<html ng-app="xmpl">
  <head>
    <script src="http://code.angularjs.org/angular-1.0.2.min.js"></script>
    <script src="script.js"></script>
  </head>
  <body>
    <div ng-controller="XmplController">
      {{ greeting }}!
    </div>
  </body>
</html>
 

script.js:

angular.module('xmpl.service', []).     //服務模塊
  value('greeter', {       //自定義greeter對象
    salutation: 'Hello',
    localize: function(localization) {
        this.salutation = localization.salutation;
    },
    greet: function(name) {
        return this.salutation + ' ' + name + '!';
    }
  }).
  value('user', {     //自定義user對象
    load: function(name) {
        this.name = name;
    }
  });
angular.module('xmpl.directive', []);    //指令模塊
angular.module('xmpl.filter', []);     //過濾器模塊
angular.module('xmpl', ['xmpl.service', 'xmpl.directive', 'xmpl.filter']).   //模塊xmpl依賴於數組中的模塊
  run(function(greeter, user) {
    // 初始化代碼,應用啟動時,會自動執行
    greeter.localize({
       salutation: 'Bonjour'
    });
    user.load('World');
  })
// A Controller for your app
var XmplController = function($scope, greeter, user) {
     $scope.greeting = greeter.greet(user.name);
}
 

這樣拆分的原因是,在你的測試中常常需要忽略掉初始化代碼,因為這些代碼比較難測試。通過把它拆分出來就能在測試中方便地忽視掉它。通過只加載和當前測試相關的模塊,也能使測試更專一。以上只是一個建議,你可以放心根據你的具體情況來調整。

一個模塊就是一系列配置和代碼塊的集合,它們是在啟動階段就附加到應用上的。一個最簡單的模塊由兩類代碼塊集合組成的:

  1. 配置代碼塊 - 在注入提供者注入和配置階段執行。只有注入提供者和常量可以被注入到配置塊中。這是為了防止服務在被配置好之前就被提前初始化。
  2. 運行代碼塊 - 在注入器被創建後執行,被用來啟動應用的。只有實例和常量能被注入到運行塊中。這是為了防止在運行後還出現對系統的配置。

代碼實現:

angular.module('myModule', []).    
  config(function(injectables) { // provider-injector 配置代碼塊     // This is an example of config block.     // You can have as many of these as you want.     // You can only inject Providers (not instances)     // into the config blocks.   }). run(function(injectables) { // instance-injector 運行代碼塊     // This is an example of a run block.     // You can have as many of these as you want.     // You can only inject instances (not Providers)     // into the run blocks   });
 

模塊還有一些配置的簡便方法,使用它們的效果等同於使用代碼塊。舉個例子:

 
angular.module('myModule', []).
  value('a', 123).
  factory('a', function() { return 123; }).
  directive('directiveName', ...).
  filter('filterName', ...);
// is same as
angular.module('myModule', []).
  config(function($provide, $compileProvider, $filterProvider) {
    $provide.value('a', 123)
    $provide.factory('a', function() { return 123; })
    $compileProvider.directive('directiveName', ...).
    $filterProvider.register('filterName', ...);
  });

配置塊會按照$provide, $compileProvider, $filterProvider,注冊的順序,依次被應用。唯一的例外是對常量的定義,它們應該始終放在配置塊的開始處。

運行塊是AngularJS中最像主方法的東西。一個運行塊就是一段用來啟動應用的代碼。它在所有服務都被配置和所有的注入器都被創建後執行。運行塊通常包含了一些難以測試的代碼,所以它們應該寫在單獨的模塊裡,這樣在單元測試時就可以忽略它們了。

模塊可以把其他模塊列為它的依賴。“依賴某個模塊”意味著需���把這個被依賴的模塊在本塊模塊之前被加載。換句話說被依賴模塊的配置塊會在本模塊配置塊前被執行。運行塊也是一樣。任何一個模塊都只能被加載一次,即使它被多個模塊依賴。

模塊是一種用來管理$injector配置的方法,和腳本的加載沒有關系。現在網上已有很多控制模塊加載的庫,它們可以和AngularJS配合使用。因為在加載期間模塊不做任何事情,所以它們可以以任意順序或者並行方式加載

AngularJS權威教程 清晰PDF版  http://www.linuxidc.com/Linux/2015-01/111429.htm

希望你喜歡,並分享我的工作~帶你走近AngularJS系列

  1. 帶你走近AngularJS - 基本功能介紹 http://www.linuxidc.com/Linux/2014-05/102140.htm
  2. 帶你走近AngularJS - 體驗指令實例 http://www.linuxidc.com/Linux/2014-05/102141.htm
  3. 帶你走近AngularJS - 創建自定義指令 http://www.linuxidc.com/Linux/2014-05/102142.htm

如何在 AngularJS 中對控制器進行單元測試 http://www.linuxidc.com/Linux/2013-12/94166.htm

在 AngularJS 應用中通過 JSON 文件來設置狀態 http://www.linuxidc.com/Linux/2014-07/104083.htm

AngularJS 之 Factory vs Service vs Provider http://www.linuxidc.com/Linux/2014-05/101475.htm

AngularJS —— 使用 ngResource、RESTful APIs 和 Spring MVC 框架提交數據 http://www.linuxidc.com/Linux/2014-07/104402.htm

AngularJS 的詳細介紹:請點這裡
AngularJS 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved