2017-05-29 50 views
0

比方說,我有以下文件角4重構構造

blog.abstract.ts

import { Component, ElementRef } from '@angular/core'; 
import { ItemService } from 'services/item/item.service'; 
import { Router } from '@angular/router'; 
import { ModalService } from 'services/modal/modal.service'; 

export class AbstractBlog { 
    constructor(protected modalService: ModalService, protected router: Router, protected itemService: ItemService) { } 
    // use services 
} 

blog1.component.ts

import { Component, ElementRef } from '@angular/core'; 
import { ItemService } from 'services/item/item.service'; 
import { Router } from '@angular/router'; 
import { ModalService } from 'services/modal/modal.service'; 

@Component({ 
    selector: 'app-blog-1', 
    templateUrl: 'blog-1.html', 
}) 
export class Blog1Component extends AbstractBlog { 
    constructor(private _elementRef: ElementRef, modalService: ModalService, router: Router, itemService: ItemService) { 
    super(modalService, router, itemService); 
    } 
    // use services & _elementRef 
} 

blog2.component .ts

import { Component, ElementRef } from '@angular/core'; 
import { ItemService } from 'services/item/item.service'; 
import { Router } from '@angular/router'; 
import { ModalService } from 'services/modal/modal.service'; 

@Component({ 
    selector: 'app-blog-2', 
    templateUrl: 'blog-2.html', 
}) 
export class Blog2Component extends AbstractBlog{ 
    constructor(modalService: ModalService, router: Router, itemService: ItemService) { 
    super(modalService, router, itemService); 
    } 
    // use services 
} 

我想簡化構造函數並避免導入每個服務&每次我需要一個新的BlogComponent時使用super(....)方法。
假設有一百個BlogComponent,並且它們中的每一個都位於不同的文件夾中。
對於每個這些模塊,我需要擴展AbstractBlog,導入服務並使用相同的參數調用super方法。
現在,如果我想在AbstractBlog的構造函數中添加另一個服務,我將不得不更新一百個文件以匹配構造函數。
有沒有更好的方法來處理這種情況?

+0

爲你解答yurzui只能使用'Injector' – yurzui

+0

感謝。 你能告訴我一個基於這個例子的注射器的例子嗎? – melkir

+0

https://stackoverflow.com/questions/39038791/inheritance-and-dependency-injection – yurzui

回答

1

由於繼承當前的工作方式在角注入類,DI註釋從注射父類(有InjectableComponentDirective之一,...裝飾)繼承。

如果新的依賴必須被添加到孩子constructorconstructor簽名應重複全部,它也傳遞依賴關係父類的構造與super(...)(就像它是在原來的代碼完成)。否則constructor可以省略從父類繼承。

這取決於子類中依賴集之間的區別有多大。如果不是顯著,父類可以有額外的依賴或兩個,如果它有助於保持子類幹:

@Injectable() 
export class AbstractBlog { 
    constructor(
    protected elementRef: ElementRef, // used only by BlogComponent 
    protected modalService: ModalService, 
    protected router: Router, 
    protected itemService: ItemService 
) { } 
} 

export class BlogComponent extends AbstractBlog { 
    // use services 
} 

export class Blog2Component extends AbstractBlog { 
    // use services 
}