Angular 元件通訊的三種方式
阿新 • • 發佈:2021-08-10
我們可以通過以下三種方式來實現:
- 傳遞一個元件的引用給另一個元件
- 通過子元件傳送EventEmitter和父元件通訊
- 通過serive通訊
1. 傳遞一個元件的引用給另一個元件
模板引用變數通常用來引用模板中的某個 DOM 元素,它還可以引用 Angular 元件或指令或Web Component。
使用井號 (#) 來宣告引用變數。 #phone 的意思就是宣告一個名叫 phone 的變數來引用 元素
這種方式適合元件間有依賴關係。 app component
<app-side-bar-toggle [sideBar]="sideBar"></app-side-bar-toggle> <app-side-bar #sideBar></app-side-bar>
@Component({ selector: 'app-side-bar-toggle', templateUrl: './side-bar-toggle.component.html', styleUrls: ['./side-bar-toggle.component.css'] }) export class SideBarToggleComponent { @Input() sideBar: SideBarComponent; @HostListener('click') click() { this.sideBar.toggle(); } }
@Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: [ './app.component.css' ] }) export class AppComponent { sideBarIsOpened = false; toggleSideBar(shouldOpen: boolean) { this.sideBarIsOpened = !this.sideBarIsOpened; } }
2. 通過子元件傳送EventEmitter和父元件通訊
Demo2這種方式利用事件傳播,需要在子元件中寫app.component.html
<app-side-bar-toggle (toggle)="toggleSideBar()"></app-side-bar-toggle> <app-side-bar [isOpen]="sideBarIsOpened"></app-side-bar>
@Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: [ './app.component.css' ] }) export class AppComponent { sideBarIsOpened = false; toggleSideBar(shouldOpen: boolean) { this.sideBarIsOpened = !this.sideBarIsOpened; } }
@Component({ selector: 'app-side-bar-toggle', templateUrl: './side-bar-toggle.component.html', styleUrls: ['./side-bar-toggle.component.css'] }) export class SideBarToggleComponent { @Output() toggle: EventEmitter<null> = new EventEmitter(); @HostListener('click') click() { this.toggle.emit(); } }
@Component({ selector: 'app-side-bar', templateUrl: './side-bar.component.html', styleUrls: ['./side-bar.component.css'] }) export class SideBarComponent { @HostBinding('class.is-open') @Input() isOpen = false; }
3. 通過service進行通訊
Demo3 這裡需要新建side-bar.service,我們把toggle方法寫到service檔案中, 然後將service注入到side-bar-toggle.component和side-bar-toggle.component,前者呼叫toggle方法,傳送事件流,後者訂閱事件
<app-side-bar-toggle></app-side-bar-toggle> <app-side-bar></app-side-bar>
@Component({ selector: 'app-side-bar-toggle', templateUrl: './side-bar-toggle.component.html', styleUrls: ['./side-bar-toggle.component.css'] }) export class SideBarToggleComponent { constructor( private sideBarService: SideBarService ) { } @HostListener('click') click() { this.sideBarService.toggle(); } }
@Component({ selector: 'app-side-bar', templateUrl: './side-bar.component.html', styleUrls: ['./side-bar.component.css'] }) export class SideBarComponent { @HostBinding('class.is-open') isOpen = false; constructor( private sideBarService: SideBarService ) { } ngOnInit() { this.sideBarService.change.subscribe(isOpen => { this.isOpen = isOpen; }); } }
@Injectable() export class SideBarService { isOpen = false; @Output() change: EventEmitter<boolean> = new EventEmitter(); toggle() { this.isOpen = !this.isOpen; this.change.emit(this.isOpen); } }