1. 程式人生 > >angular 2 中可以注入介面嗎?如何實現?

angular 2 中可以注入介面嗎?如何實現?

答:不能,因為TypeScript的介面是設計時的, JavaScript沒有介面。 TypeScript程式碼​​從生成的JavaScript過程中消失。沒有任何介面型別資訊可供Angular在執行時查詢。

有兩個方案可以實現:

1、方案1: 最簡單的解決方案就是定義一個實現介面的抽象類。通常,無論如何你都需要一個抽象類。

定義介面:

import {Role} from "../../model/role";

export interface ProcessEngine {

     login(username: string, password: string):string;

     getRoles(): Role[];
}

抽象類:

import {ProcessEngine} from "./process-engine.interface";

export abstract class ProcessEngineService implements ProcessEngine {

    abstract login(username: string, password: string): string;

    abstract getRoles(): Role[];

}

實現類:

import { Injectable } from '@angular/core';
import {ProcessEngineService} from "./process-engine.service";

@Injectable()
export class WebRatioEngineService extends ProcessEngineService {

    login(username: string, password: string) : string {...}

    getRoles(): Role[] {...}

}

定義provider:

@NgModule({
      ...
      providers: [
        ...,
        {provide: ProcessEngineService, useClass: WebRatioEngineService}
      ]
})

2、方案2:Angular的官方文件建議使用InjectionToken,類似於OpaqueToken。

Your interface and class:

export interface AppConfig {
   apiEndpoint: string;
   title: string;
}

export const HERO_DI_CONFIG: AppConfig = {
  apiEndpoint: 'api.heroes.com',
  title: 'Dependency Injection'
};

Define your Token:

import { InjectionToken } from '@angular/core';

export let APP_CONFIG = new InjectionToken<AppConfig>('app.config');

使用InjectionToken物件註冊依賴項提供程式

providers: [{ provide: APP_CONFIG, useValue: HERO_DI_CONFIG }]

你可以通過@Inject裝飾器將配置物件注入任何需要它的建構函式中:

constructor(@Inject(APP_CONFIG) config: AppConfig) {
     this.title = config.title;
}

相關推薦

angular 2 可以注入介面?如何實現

答:不能,因為TypeScript的介面是設計時的, JavaScript沒有介面。 TypeScript程式碼​​從生成的JavaScript過程中消失。沒有任何介面型別資訊可供Angular在執行時查詢。 有兩個方案可以實現: 1、方案1: 最簡單的解決方案就是定義一個實現介面的抽象類。通常,無論如何你都

Angular 2的依賴注入

翻譯者:http://kittencup.com/javascript/2015/07/23/Angular%202%E4%B8%AD%E7%9A%84%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.html 依賴注入一直是An

javaList介面實現類 ArrayList,LinkedList,Vector 的區別 list實現類原始碼分析

java面試中經常被問到list常用的類以及內部實現機制,平時開發也經常用到list集合類,因此做一個原始碼級別的分析和比較之間的差異。 首先看一下List介面的的繼承關係: list介面繼承Col

angular 2elasticsearch.js的使用

1.安裝 進入angular工程中, 執行 npm install --save elasticsearch 2.封裝api // 參考-https://www.elastic.co/guid

為什麼spring注入介面正確而注入介面實現類錯誤?

這是我在做spring和mybatis整合的時候出現的問題。 這個問題的根本在於動態代理類生成代理物件。動態代理有兩種的實現方式jdk和cglib的方式,這兩種方式也是AOP的,實現原理。 原因

JavaMap介面實現

Map介面及實現:  1. Map介面   Map是從鍵到值的對映,鍵不允許重複,每個鍵最多能對映一個值.public interface Map<K,V> {    // Query Operations    int size();    boolean is

四,Java集合類(2)——Set介面及其實現

1,Set介面及其實現類 Set集合與Collection基本相同,沒有提供任何額外的方法。實際上Set就是Collection,只是行為略有不同。Set集合不允許包含相同的元素,如果試圖把兩個相同的元素加入同一個Set集合中,新增操作失敗,add()方法返回

Angular 2 的元件(一)

簡述 元件是Angular 2 眾多好的理念之一。 在Angular apps中,我們使用HTML的標籤來編寫我們的互動應用。但是瀏覽器只理解一些標籤,像select或者form等一些瀏覽器建立者定義的標籤。 我們如何讓瀏覽器認識新的標籤呢?如果我們想使用

java 一些介面實現類的區別

線性表,連結串列,雜湊表是常用的資料結構,在進行Java開發時,JDK已經為我們提供了一系列相應的類來實現基本的資料結構。這些類均在java.util包中。本文試圖通過簡單的描述,向讀者闡述各個類的作用以及如何正確使用這些類。           Collection    

Qt5.2使用ping命令實現Ip掃描功能

     在實現類似於Free IP Scanner 2.1的Ip掃描器軟體中,會用到ping命令。如果使用Qt程式設計實現,主要會用QThread、QProcess這兩個類。關於這兩個類的具體用法可以查閱Qt助手或者QT官網。    在QT中為了掃描大量的Ip,通常需要將

java,一個類實現某個介面,必須重寫介面的所有方法?拓展介面而不重寫相當於抽象類

不一定,關鍵要看子類是否是抽象類。 如果子類是非抽象類,則必須實現介面中的所有方法;  如果子類是抽象類,則可以不實現介面中的所有方法,因為抽象類中允許有抽象方法的存在! 1、抽象類定義 抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但

Java,一個類實現某個介面,必須重寫介面的所有方法

在這裡特別記錄一下,以防自己再次用錯~ “Java中,一個類實現了某介面,則必須實現該介面中的所有方法麼?”這句話其實是不準確的,因為我們還沒有考慮到抽象類。 抽象類實現某個介面,可以不實現所有介面的方法,可以由它的子類實現。而普通類即非抽象類則必須實現接口裡的全部方法。

.NET Core的一個介面多種實現的依賴注入與動態選擇看這篇就夠了

最近有個需求就是一個抽象倉儲層介面方法需要SqlServer以及Oracle兩種實現方式,為了靈活我在依賴注入的時候把這兩種實現都給注入進了依賴注入容器中,但是在服務呼叫的時候總是獲取到最後注入的那個方法的實現,這時候就在想能不能實現動態的選擇使用哪種實現呢?如果可以的話那麼我只需要在配置檔案中進行相應的配置

java,一個類實現某個介面,必須重寫介面的所有方法

java中,一個類實現某個介面,必須重寫介面中的所有方法嗎? 不一定,關鍵要看子類是否是抽象類。 如果子類是非抽象類,則必須實現介面中的所有方法;  如果子類是抽象類,則可以不實現介面中的所有方法,因為抽象類中允許有抽象方法的存在! 1、抽象類定義 抽象類往往用來表徵對問題領域進行分析

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(5.2) 登入功能的實現介面注入、log4net的使用

索引 簡述 前兩天事情比較多,耽誤更新了,希望大家多多包涵,今天我們繼續做我們的登入功能 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行

【轉】shell命令>/dev/null 2>&1的實現原理

情況 內存 顯示 都是 style hand 引用 nis roo 異步執行 exec("/alidata/server/php/bin/php /nas/wxdoctor/index.php App/Common/WordsPic/user_id/".$user_

【轉載】在Angular 2/Typescript聲明全局變量的最佳方式是什麽?

more 中一 keyword 訪問 emit 更新 other link 之間 問題詳細描述 我想在Typescript語言中的Angular 2中聲明一些全局可見的變量。最佳的實踐方法是? 推薦的實現方法 這是最簡單的解決方案,無需使用Service或Observe

js跨越請求的2實現 JSONP /後端接口設置運行跨越header

分隔 java 參數 pre jquery實現 域名 jquery api 設置 由於瀏覽器同源策略,a域名的js向b域名ajax請求會被禁止。JS實現跨越訪問接口有2中辦法。 1.後端接口設置允許跨越的header頭。 //header(‘Access-Control-

Centos 6.9 http-2.2 的一些基本操作和 https 的實現

http http-2.2 https 首先聲明: 接下來的所有的操作都是基於防火墻和selinux關閉的情況下;是基於本地的實現;1.建立httpd服務,要求: 1) 提供兩個基於名稱的虛擬主機www1, www2;要求每個虛擬主機都有單獨的錯誤日誌

UWP使用Composition API實現吸頂(2

.com 部分 線性 col 調整 row 系統內置 模板 高度 原文:UWP中使用Composition API實現吸頂(2)在上一篇中我們討論了不涉及Pivot的吸頂操作,但是一般來說,吸頂的部分都是Pivot的Header,所以在此我們將討論關於Pivot多個Item