国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

angular組件繼承的實現(xiàn)方法第1/2頁

2019-11-19 14:17:43
字體:
供稿:網(wǎng)友

Angular 2.3 版本中引入了組件繼承的功能,該功能非常強大,能夠大大增加我們組件的可復(fù)用性。

組件繼承涉及以下的內(nèi)容:

Metadata:如 @Input()、@Output()、@ContentChild/Children、@ViewChild/Children 等。在派生類中定義的元數(shù)據(jù)將覆蓋繼承鏈中的任何先前的元數(shù)據(jù),否則將使用基類元數(shù)據(jù)。

Constructor:如果派生類未聲明構(gòu)造函數(shù),它將使用基類的構(gòu)造函數(shù)。這意味著在基類構(gòu)造函數(shù)注入的所有服務(wù),子組件都能訪問到。

Lifecycle hooks:如果基類中包含生命周期鉤子,如 ngOnInit、ngOnChanges 等。盡管在派生類沒有定義相應(yīng)的生命周期鉤子,基類的生命周期鉤子會被自動調(diào)用。

需要注意的是,模板是不能被繼承的 ,因此共享的 DOM 結(jié)構(gòu)或行為需要單獨處理。了解詳細信息,請查看 - properly support inheritance。

接下來我們來快速體驗的組件繼承的功能并驗證以上的結(jié)論,具體示例如下(本文所有示例基于的 Angular 版本是 - 4.0.1):

exe-base.component.ts

import { Component, ElementRef, Input, HostBinding, HostListener, OnInit } from '@angular/core'; @Component({  selector: 'exe-base', // template will not be inherited template: `  <div>    exe-base:我是base組件么? - {{isBase}}  </div> ` }) export class BaseComponent implements OnInit { @Input() isBase: boolean = true; @HostBinding('style.color') color = 'blue'; // will be inherited @HostListener('click', ['$event']) // will be inherited onClick(event: Event) { console.log(`I am BaseComponent`);  } constructor(protected eleRef: ElementRef) { }  ngOnInit() { console.dir('BaseComponent:ngOnInit method has been called');  }}

exe-inherited.component.ts

import { Component, HostListener, OnChanges, SimpleChanges } from '@angular/core'; import { BaseComponent } from './exe-base.component'; @Component({  selector: 'exe-inherited',  template: `  <div>   exe-inherited:我是base組件么? - {{isBase}}  </div> ` }) export class InheritedComponent extends BaseComponent implements OnChanges { @HostListener('click', ['$event']) // overridden onClick(event: Event) { console.log(`I am InheritedComponent`);  }  ngOnChanges(changes: SimpleChanges) { console.dir(this.eleRef); // this.eleRef.nativeElement:exe-inherited }}

app.component.ts

import { Component, OnInit } from '@angular/core'; import {ManagerService} from "./manager.service"; @Component({ selector: 'exe-app', template: `  <exe-base></exe-base>  <hr/>  <exe-inherited [isBase]="false"></exe-inherited> ` }) export class AppComponent { currentPage: number = 1; totalPage: number = 5;}

接下來我們簡要討論一個可能令人困惑的主題,@Component() 中元數(shù)據(jù)是否允許繼承?答案是否定的,子組件是不能繼承父組件裝飾器中元數(shù)據(jù)。限制元數(shù)據(jù)繼承,從根本上說,是有道理的,因為我們的元數(shù)據(jù)用是來描述組件類的,不同的組件我們是需要不同的元數(shù)據(jù),如 selector、template 等。Angular 2 組件繼承主要還是邏輯層的復(fù)用,具體可以先閱讀完下面實戰(zhàn)的部分,再好好體會一下哈。

現(xiàn)在我們先來實現(xiàn)一個簡單的分頁組件,simple-pagination.component.ts

import { Component, Input, Output, EventEmitter } from '@angular/core'; @Component({  selector: 'simple-pagination',  template: `    <button (click)="previousPage()" [disabled]="!hasPrevious()">Previous</button>     <button (click)="nextPage()" [disabled]="!hasNext()">Next</button>    <p>page {{ page }} of {{ pageCount }} </p>  ` }) export class SimplePaginationComponent { @Input() pageCount: number; @Input() page: number; @Output() pageChanged = new EventEmitter<number>();  nextPage() { this.pageChanged.emit(++this.page);  }  previousPage() { this.pageChanged.emit(--this.page);  }  hasPrevious(): boolean { return this.page > 1;  }  hasNext(): boolean { return this.page < this.pageCount;  }}

app.component.ts

import { Component, OnInit } from '@angular/core'; import {ManagerService} from "./manager.service"; @Component({ selector: 'exe-app', template: `  <simple-pagination                                                 
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 浦江县| 高雄县| 禹城市| 朔州市| 阜南县| 富川| 辽阳市| 南溪县| 巫溪县| 石河子市| 长治市| 周至县| 潼关县| 万山特区| 河曲县| 沙雅县| 得荣县| 开封市| 全南县| 雷州市| 建德市| 通辽市| 嘉荫县| 婺源县| 邹城市| 乐亭县| 宁国市| 鄂托克前旗| 理塘县| 长沙市| 确山县| 金堂县| 苏尼特左旗| 新乡县| 孟津县| 永寿县| 临海市| 开平市| 大冶市| 株洲县| 伊春市|