詳解Angular中組件間通訊的幾種方法
本篇文章帶大家詳細了解Angular中元件間通訊的幾種。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
Angular 元件間的通訊
元件間三種典型關係式:
父好元件之間的互動(@Input/@Output/模板變數/@ViewChild)
非父子元件之間的互動( Service/localStorage)
也可以利用Session、路由參數來進行通訊等
相關教學推薦:《angular教學》
父子元件之間互動
#子元件寫
- child.component.ts
@Component({ selector: 'app-child', templateUrl: './child.component.html', styleUrls: ['./child.component.css'] }) export class ChildComponent implements OnInit { private _childTitle = '我是子组件'; @Input() set childTitle(childTitle: string) { this._childTitle = childTitle; } get childTitle(): string { return this._childTitle; } @Output() messageEvent: EventEmitter<string> = new EventEmitter<string>(); constructor() { } ngOnInit(): void { } sendMessage(): void { this.messageEvent.emit('我是子组件'); } childFunction(): void { console.log('子组件的名字是:' + this.childTitle); } }
- child.component.html
<div class="panel panel-primary"> <div class="panel-heading">{{childTitle}}</div> <div class="panel-body"> <button (click)="sendMessage()" class="btn btn-success">给父组件发消息</button> </div> </div>
父親元件
- parent-and-child.component.ts
@Component({ selector: 'app-parent-and-child', templateUrl: './parent-and-child.component.html', styleUrls: ['./parent-and-child.component.css'] }) export class ParentAndChildComponent implements OnInit { constructor() { } ngOnInit(): void { } doSomething(event: any): void { alert(event); } }
- parent-and-child.component.html
<div class="panel panel-primary"> <div class="panel-heading">父组件</div> <div class="panel-body"> <app-child #child (messageEvent) = "doSomething($event)"></app-child> <button (click)="child.childFunction()" class="btn btn-success">调用子组件的方法</button> </div> </div>
@Input 屬性綁定是單向的,父組件的屬性變化會影響子組件的屬性變化, 子組件的屬性變化不會反過來影響父組件的屬性變化。
不過,可以利用 @Input() 和 @Output() 實作屬性的雙向綁定。
@Input() value: string; @Output() valueChange: EventEmitter<any> = new EventEmitter(); // 实现双向绑定 <input [(value)] = "newValue"></input>
注意: 使用 [()]
進行雙向綁定時,輸出屬性名稱必須是輸入屬性名稱與 Change 組成, 形如: xxxChange。
非父子元件之間互動
使用Service 進行互動
- event-bus.service.ts
/** * 用于充当事件总线 */ @Injectable() export class EventBusService { evnetBus: Subject<string> = new Subject<string>(); constructor() { } }
- child1.component.ts
@Component({ selector: 'app-child1', templateUrl: './child1.component.html', styleUrls: ['./child1.component.css'] }) export class Child1Component implements OnInit { constructor(private eventBusService: EventBusService) { } ngOnInit(): void { } triggerEventBus(): void { this.eventBusService.evnetBus.next('child1 触发的事件'); } }
- child1.component.html
<div class="panel panel-primary"> <div class="panel-heading">child1 组件</div> <div class="panel-body"> <button (click)="triggerEventBus()" class="btn btn-success">触发事件</button> </div> </div>
- child2 .component.ts
@Component({ selector: 'app-child2', templateUrl: './child2.component.html', styleUrls: ['./child2.component.css'] }) export class Child2Component implements OnInit { events: Array<string> = new Array<string>(); constructor(private eventBusService: EventBusService) { } ngOnInit(): void { this.listenerEvent(); } listenerEvent(): void { this.eventBusService.evnetBus.subscribe( value => { this.events.push(value); }); } }
- child2.component.html
<div class="panel panel-primary"> <div class="panel-heading">child2 组件</div> <div class="panel-body"> <p *ngFor="let event of events">{{event}}</p> </div> </div>
- brother.component.ts
@Component({ selector: 'app-brother', templateUrl: './brother.component.html', styleUrls: ['./brother.component.css'] }) export class BrotherComponent implements OnInit { constructor() { } ngOnInit(): void { } }
- brother.component.html
<div class="panel panel-primary"> <div class="panel-heading">第二种:没有父子关系的组件间通讯</div> <div class="panel-body"> <app-child1></app-child1> <app-child2></app-child2> </div> </div>
使用localStorage 進行互動
- local-child1.component.ts
@Component({ selector: 'app-local-child1', templateUrl: './local-child1.component.html', styleUrls: ['./local-child1.component.css'] }) export class LocalChild1Component implements OnInit { constructor() { } ngOnInit(): void { } writeData(): void { window.localStorage.setItem('message', JSON.stringify({name: 'star', age: 22})); } }
- local-child1.component.html
<div class="panel panel-primary"> <div class="panel-heading"> LocalChild1 组件</div> <div class="panel-body"> <button class="btn btn-success" (click)="writeData()">写入数据</button> </div> </div>
- local-child2.component.ts
@Component({ selector: 'app-local-child2', templateUrl: './local-child2.component.html', styleUrls: ['./local-child2.component.css'] }) export class LocalChild2Component implements OnInit { constructor() { } ngOnInit(): void { } readData(): void { const dataStr = window.localStorage.getItem('message'); const data = JSON.parse(dataStr); console.log('name:' + data.name, 'age:' + data.age); } }
- local-child2 .component.html
<div class="panel panel-primary"> <div class="panel-heading">LocalChild2 组件</div> <div class="panel-body"> <button class="btn btn-success" (click)="readData()">读取数据</button> </div> </div>
- local-storage.component.ts
@Component({ selector: 'app-local-storage', templateUrl: './local-storage.component.html', styleUrls: ['./local-storage.component.css'] }) export class LocalStorageComponent implements OnInit { constructor() { } ngOnInit(): void { } }
- local-storage.component.html
<div class="panel panel-primary"> <div class="panel-heading">第三种方案:利用 localStorge 通讯</div> <div class="panel-body"> <app-local-child1></app-local-child1> <app-local-child2></app-local-child2> </div> </div>
最後,關於使用Session、路由參數實現資料互動的方式,這裡就不示範了。
更多程式相關知識,請造訪:程式設計影片! !
以上是詳解Angular中組件間通訊的幾種方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

這篇文章繼續Angular的學習,帶大家了解Angular中的元數據和裝飾器,簡單了解一下他們的用法,希望對大家有幫助!

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業務中用到的 monaco-editor 在 angular 中的使用,希望對大家有幫助!

這篇文章跟大家分享一個Angular實戰,了解一下angualr 結合 ng-zorro 如何快速開發一個後台系統,希望對大家有幫助!

隨著網路的快速發展,前端開發技術也不斷改進與迭代。 PHP和Angular是兩種廣泛應用於前端開發的技術。 PHP是一種伺服器端腳本語言,可以處理表單、產生動態頁面和管理存取權限等任務。而Angular是一種JavaScript的框架,可以用來開發單一頁面應用程式和建構元件化的網頁應用程式。本篇文章將介紹如何使用PHP和Angular進行前端開發,以及如何將它們

身份驗證是任何網路應用程式中最重要的部分之一。本教程討論基於令牌的身份驗證系統以及它們與傳統登入系統的差異。在本教程結束時,您將看到一個用Angular和Node.js編寫的完整工作演示。傳統身份驗證系統在繼續基於令牌的身份驗證系統之前,讓我們先來看看傳統的身份驗證系統。使用者在登入表單中提供使用者名稱和密碼,然後點擊登入。發出請求後,透過查詢資料庫在後端驗證使用者。如果請求有效,則使用從資料庫中獲取的使用者資訊建立會話,然後在回應頭中傳回會話訊息,以便將會話ID儲存在瀏覽器中。提供用於存取應用程式中受
