本篇文章帶大家詳細了解Angular中元件間通訊的幾種。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
元件間三種典型關係式:
父好元件之間的互動(@Input/@Output/模板變數/@ViewChild)
非父子元件之間的互動( Service/localStorage)
也可以利用Session、路由參數來進行通訊等
相關教學推薦:《angular教學》
#子元件寫
@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); } }
<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>
父親元件
@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); } }
<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 進行互動
/** * 用于充当事件总线 */ @Injectable() export class EventBusService { evnetBus: Subject<string> = new Subject<string>(); constructor() { } }
@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 触发的事件'); } }
<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>
@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); }); } }
<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>
@Component({ selector: 'app-brother', templateUrl: './brother.component.html', styleUrls: ['./brother.component.css'] }) export class BrotherComponent implements OnInit { constructor() { } ngOnInit(): void { } }
<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 進行互動
@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})); } }
<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>
@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); } }
<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>
@Component({ selector: 'app-local-storage', templateUrl: './local-storage.component.html', styleUrls: ['./local-storage.component.css'] }) export class LocalStorageComponent implements OnInit { constructor() { } ngOnInit(): void { } }
<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中文網其他相關文章!