Angular定義服務-Learn By Doing

来源:http://www.cnblogs.com/liminjun88/archive/2016/09/17/5878343.html
-Advertisement-
Play Games

懶實例化-一個服務只有當程式的組件用到它的時候才進行實例化; 單例模式-每個依賴服務的組件,都是獲得服務工廠生成單個實例的引用。服務是一個單例對象或函數,對外提供特定的功能。 ...


1.服務(Service)介紹

Angular services are substitutable objects that are wired together using dependency injection (DI). You can use services to organize and share code across your app.

Angular服務的兩大特點:

  • Lazily instantiated – Angular only instantiates a service when an application component depends on it.
  • Singletons – Each component dependent on a service gets a reference to the single instance generated by the service factory.

懶實例化-一個服務只有當程式的組件用到它的時候才進行實例化;
單例模式-每個依賴服務的組件,都是獲得服務工廠生成單個實例的引用。服務是一個單例對象或函數,對外提供特定的功能。

官方提供的示例demo: Using a Service

2.內置(built-in)服務

Angular本身提供了非常多的內置服務,方便用戶進行開發。和後端打交道用到的$http,URL跳轉用到的$location;動畫相關的$animate服務等等。

Angular內置服務

3.自定義(custom)服務的五種方式

3.1 value()

定義一個服務,服務可以是字元串,數字或者函數,對象等。它和constant不相同的地方是,它可以在其他
的地方修改,但是不能註入到config中,但是它可以被裝飾器decorator修飾。

var app = angular.module('app', []);
app.value('appVersion',"v.1.0.1");

3.2 constant()

定義常量時候使用,定義的值不能進行修改。可以註入到任何需要它的組件中,但是不能被裝飾器decorator修飾。
前後端分類的項目中,定義後端伺服器URL地址。代碼如下:

var app = angular.module('app', []);
app.constant('AppConfig', {
    serverBaseUrl: 'http://192.168.1.1/api/',
});

3.3 factory()

註入的一個function,是在開發過程,自定義服務方法使用做多的一種方式。它和service的區別是,factory註入的是普通的function,而service註入的是一個構造函數constructor。因為它可以返回任何東西,所以在實際開發中使用的最多。它實際上是一個只有$get方法的provider

var app = angular.module('app', []);
app.factory('myService',function(){
  var appVersion="v.1.0.1";
  return appVersion;
});

3.4 service()

註入的是一個構造器,可以在控制器之間共用數據。

var app = angular.module('app' ,[]);
 
app.config(function ($provide) {
  $provide.service('customData', function () {
    this.data = 'Angular Service Here';
  });
});

3.5 provider()

provider可以說是一個可以配置的factory。Angular規定provider必須返回一個$get方法。provider是value,servicefactory的封裝。value,servicefactory三種方式定義的服務,底層還是調用provider方法。

var app = angular.module('app', []);
app.config(function($provide) {
  $provide.provider('registration', function() {
    var type;
    return {
      setType: function(value) {
        type = value;
      },
      $get: function() {
        return {
          title: 'Service from Provider ' + type
        }
      }
    }
  })
});
//對registrationProvider進行配置
app.config(function(registrationProvider) {
  registrationProvider.setType('Angular');
});

說明:在配置這裡,我們註入的registrationProvider而不是在provider方法裡面定義的registration服務名稱,這裡其實是Angular本身通過做的一件事情。config裡面要註入供應商,所以寫成駝峰命名格式registrationProvider,Angular會幫我們註入這個provider。

3.6 Decorator

在說明valueconstant方法時,提到了裝飾器decorator。它本身不是Provider,而是來裝飾其他的provider的。而上面說過provider是value,servicefactory的封裝。但是constant不是,所有decorator不能裝飾constant。裝飾這個概念,個人理解類似C#裡面的委托,可以改變已經定義服務裡面的方法實現。

value裝飾

var app = angular.module('app', []);
app.value('appVersion',"v.1.0.1");

app.config(function($provide){
    $provide.decorator('appVersion',function($delegate){
      return $delegate+"- @cmsoft"
    });
});

參考

Angular Service
AngularJS中的Provider們:Service和Factory等的區別
走進AngularJs(六) 服務
http://www.html-js.com/article/1825


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 開發者工具 在移動開發中,一種較為容易的做法是,先在桌面上開始原型設計,然後再在打算要支持的設備上處理移動特有的部分。多點觸摸正是難以在PC上進行測試的那些功能之一,因為大部分的PC都沒有觸摸輸入。 不得不在移動設備上進行的測試有可能會拉長你的開發周期,因為你所做的每項改變都需要提交代碼到伺服器上, ...
  • 學習bootstrap 中的柵格系統 非常重要 排版佈局經常用到 其中 row col 可以相互嵌套 穿插使用 例如: 會達成這樣的效果: 在BOOTSTRAP中 有很多現成的 按鈕 內聯框架 導航 輪播圖 等各種炫酷效果的源代碼 可直接複製粘貼皆可使用 不過 當他的細節部分不適合個人使用要求時 改 ...
  • less 是基於CSS的一種 擴展技術.less 通過解析器 (比如koala)轉換文件格式為CSS@+變數名+值語法變數LESS 允許開發者自定義變數,變數可以在全局樣式中使用,變數使得樣式修改起來更加簡單。我們可以從下麵的代碼瞭解變數的使用及作用:清單 3 LESS 文件 @border-col ...
  • 由於引用類型(數組、對象)是按地址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝一個對象,這時就需要遍歷徹底複製,使原對象和拷貝對象完全脫離關係。 代碼: 實現細節:假定傳入的是一個引用類型,首先判定傳入的是數組還是對象,根據判定結果,確定o是初始化為空數組還是空對象。之 ...
  • $HTML, HTTP,web綜合問題 常見排序演算法的時間複雜度,空間複雜度 前端需要註意哪些SEO web開發中會話跟蹤的方法有哪些 <img>的title和alt有什麼區別 doctype是什麼,舉例常見doctype及特點 HTML全局屬性(global attribute)有哪些 什麼是we ...
  • 前端無疑是2016年最火熱的技術,沒有之一。 各種前端mvc框架層出不窮,angular js,vue,react,前端組件化開發概念已經深入人心。前端工資已經比手機端開發還要高了。 作為個人站長,學習下前端設計也是有必要的,一來有些小的設計問題可以自己解決,同時還能提高自己的審美,提高網站的ui設 ...
  • 本文是蘇福的原創文章,轉載請註明出處:蘇福CNblog:http://www.cnblogs.com/susufufu/p/5878913.html 本程式【一邊玩游戲,一邊記JS的API】是本人的個人作品,寫的不好,未經本人允許,請不要用於其它用途! 玩法: 選擇一種JS的API,或隨機選一種,或 ...
  • bootstrap-table是一個基於Bootstrap風格的強大的表格插件神器,官網:http://bootstrap-table.wenzhixin.net.cn/zh-cn/ 這裡列出遇到的一個小問題:Bootstrap Table表格一直載入不了數據。 我使用訪問遠程地址返回的json數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...