角度2/4では、コンポーネントAからコンポーネントBへデータを取得したいと思います。また、BからコンポーネントCにデータを送信する必要があり、コンポーネントCから結果を表示する必要があります。誰も簡単な例で私を導くことができますか?角度2のクロスコンポーネント通信
0
A
答えて
0
コンポーネントから他のコンポーネントにデータを取得する方法は2つあります。
最初に、ComponentAに子ComponentBがあり、ComponentBにComponentCの子がある場合、HTMLを介してデータを渡します。以下のような何か:
ComponentA
@Component({
selector: 'comp-a',
template: `
<!--[inputDataB]="somedata" passing data to componentB -->
<!--[validateValue]="validateData" getting data from componetB and passing data to componentB -->
<comp-b [inputDataB]="somedata" [validateValue]="validateData"> </comp-b>`
})
export class ComponentA implements OnInit {
title = 'app works!';
somedata: any;
constructor(private service: MyService) {}
ngOnInit(): void {
this.service.getData()
.subscribe(data => this.somedata = data);
}
validateData = (num: number): boolean => {
return num >= 0;
}
}
ComponentB:
@Component({
selector: 'com-b',
template: `data of loaded in component A {{ inputDataB }}
<button (click)="processData(4)")> Do Something</button>
<span *ngIf="displayCompC"> <com-c [inputDataC]="dataC"></com-c></span>
`
})
export class ComponentB implements OnInit {
@Input()
inputDataB: any;
@Input()
validateValue: (value: number) => boolean;
dataC: number;
displayCompC: boolean;
constructor() {}
ngOnInit(): void {
this.displayCompC = false;
// on load you can modify or process data
this.dataC = this.inputDataB * 2;
}
processData = (num: number) => {
this.displayCompC = this.validateValue(num);
}
}
ComonentC
@Component({
selector: 'com-c',
template: `data of loaded in component B {{ inputDataC }}
{{inputDataC}}
`
})
export class ComponentC implements OnInit {
@Input()
inputDataC: number;
modifydata: number;
constructor() {}
ngOnInit(): void {
// on load you can modify or process data
this.modifydata = this.inputDataC * 5;
}
}
推測これはComponentAは、成分BとCのビューを持っているとして、あなたが望むものではありません
第2の方法は、各コンポーネントコンストラクタに注入するCommonDataModeを作成することです。 CommonDataModeは他のコンポーネントを介してデータを共有します。ような何か:
今import {Component, OnInit} from '@angular/core';
import {CommonDataModel} from './CommonDataMode';
import {MyService} from './MyService';
@Component({
selector: 'app-root',
template: `{{anyData}}`
})
export class AppComponent implements OnInit {
anydata: number;
constructor(private service: MyService, private commonDataModel: CommonDataModel) {}
ngOnInit(): void {
this.service.getData()
.subscribe(data => {
this.commonDataModel.data = data;
this.anydata = data;
});
}
}
@Component({
selector: 'com-b',
template: `data B {{ inputDataB }}
double: {{doubleDate}}
`
})
export class ComponentB implements OnInit {
inputDataB: any;
doubleDate: number;
constructor(private commonDataModel: CommonDataModel) {}
ngOnInit(): void {
this.inputDataB = this.commonDataModel.data;
this.doubleDate = this.commonDataModel.multiplyByTwo();
}
}
@Component({
selector: 'com-c',
template: `data of loaded in component B {{ inputDataC }}
{{inputDataC}}
`
})
export class ComponentC implements OnInit {
inputDataC: number;
modifydata: number;
constructor(private commonDataModel: CommonDataModel) {}
ngOnInit(): void {
// on load you can modify or process data
this.modifydata = this.commonDataModel.data;
this.modifydata = this.commonDataModel.multiplyByNumber(5);
}
}
CommonDataMode
import {Injectable} from "@angular/core";
@Injectable()
export class CommonDataModel {
data: number;
multiplyByTwo =(): number => {
return this.data * 2;
}
multiplyByNumber = (num: number): number => {
return this.data * num;
}
}
コンポーネントAが最初にロードする必要があるノード。コンポーネントBまたはCにあるときにページを更新すると、データは未定義ではありません。
この問題を回避するには、ルートモジュールにAPP_INITIALIZERを提供し、アプリケーションを起動する前にデータを読み込みます。
関連する問題
- 1. 角度2の異なるモジュールコンポーネント通信
- 2. クライアントとサーバー間の通信(角2度)
- 3. モジュール間の角度通信
- 4. 角2:contentChildrenの通信
- 5. 角度2通貨パイプ
- 6. 角度2通過値
- 7. 角度2と純粋なjavascriptの間の通信
- 8. app.component.tsと別のコンポーネントとの通信角度2
- 9. 角型2コンポーネント間通信
- 10. 角2/4親子通信
- 11. 角型部品通信2
- 12. 角度jsで2つのテンプレートを通信する方法は?
- 13. コンポーネントとの角度データ通信
- 14. 角度4 - モジュール間の通信 - ベストプラクティス
- 15. 共有サービスによる2つのコンポーネント間の角度2/4通信
- 16. モジュール間通信、角度J、ファクトリ
- 17. 角度4兄弟コンポーネント通信
- 18. 角2:ディレクティブとホストコンポーネント間の通信
- 19. 角度2通貨パイプ形式
- 20. 角度2ルートガードの信頼性
- 21. 角度2送信配列別のページ
- 22. 角度1の角度2+
- 23. 角度2のクライアントのSignalR APIが通知を受信していません
- 24. 角度2 +角度 - cli +角度@ 5.3
- 25. Jsonデータ+ FormDataで角度2+送信リクエスト
- 26. 角度2ルータ+角度-CLI
- 27. 角度1.5のコンポーネントコントローラ間の通信/データ共有
- 28. 角度1.5の兄弟ディレクティブ/コンポーネント間の通信方法
- 29. 角度2のビューを更新します。角度2の新しい角度
- 30. どのように角度角度2のpolyfils角度RC.1?
Angularチームにはいくつかの素晴らしい例があります(https://angular.io/guide/component-interaction)。 –