Angular のさまざまなコンポーネント間の値の転送と通信方法の詳細な例

小云云
リリース: 2017-12-28 09:33:07
オリジナル
1973 人が閲覧しました

この記事は、Angular のさまざまなコンポーネント間の値の転送と通信の方法を主に紹介しています。編集者が非常に優れていると考えたので、参考として共有します。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

この記事では、Angular がさまざまなコンポーネントでどのように値を転送し、通信するかを主に紹介します。主に親子コンポーネントと非親子コンポーネントに分かれます。

親コンポーネントと子コンポーネント間のパラメータと通信メソッド

イベント通信(EventEmitter、@Output)を使用する:

シナリオ: 親コンポーネントと子コンポーネント間の通信は、通常、子コンポーネントを使用して実行できます。メッセージを親コンポーネントに渡します。

手順:

  1. 子コンポーネントはイベント EventEmitter オブジェクトを作成し、 @output を使用して公開します。

  2. 親コンポーネントは子コンポーネント @output からのメソッドをリッスンします。イベントを担当します。

コード:


 // child 组件
  @Component({
   selector: 'app-child',
   template: '',
   styles: [``]
  })
  export class AppChildComponent implements OnInit {
   @Output() onVoted: EventEmitter<any> = new EventEmitter();
   ngOnInit(): void {
    this.onVoted.emit(1);
   }
  }
  // parent 组件
  @Component({
   selector: &#39;app-parent&#39;,
   template: `
    <app-child (onVoted)="onListen($event)"></app-child>
   `,
   styles: [``]
  })
  export class AppParentComponent implements OnInit {
   ngOnInit(): void {
    throw new Error(&#39;Method not implemented.&#39;);
   }
   onListen(data: any): void {
    console.log(&#39;TAG&#39; + &#39;---------->>>&#39; + data);
   }
  }
ログイン後にコピー

@ViewChild と @ViewChildren を使用します:

シナリオ: 通常、親コンポーネントが子コンポーネントに情報を渡すか、親コンポーネントが子コンポーネントのメソッドを呼び出すために使用されます。

    親コンポーネントで子コンポーネントを使用します。
  1. 親コンポーネントで @ViewChild を使用して、子コンポーネント オブジェクトを取得します。
  2. 親コンポーネントは、子コンポーネント オブジェクトを使用して子コンポーネントを制御します (情報を渡すか、メソッドを呼び出します)。
  3. コード:

// 子组件
@Component({
 selector: &#39;app-child&#39;,
 template: &#39;&#39;,
 styles: [``]
})
export class AppChildComponent2 implements OnInit {
  data = 1;
  ngOnInit(): void {
 }
 getData(): void {
  console.log(&#39;TAG&#39; + &#39;---------->>>&#39; + 111);
 }
}
// 父组件
@Component({
 selector: &#39;app-parent2&#39;,
 template: `
  <app-child></app-child>
 `,
 styles: [``]
})
export class AppParentComponent2 implements OnInit {
 @ViewChild(AppChildComponent2) child: AppChildComponent2;
 ngOnInit(): void {
  this.child.getData(); // 父组件获得子组件方法
  console.log(&#39;TAG&#39;+&#39;---------->>>&#39;+this.child.data);// 父组件获得子组件属性
 }
}
ログイン後にコピー

非親-子コンポーネントパラメータの受け渡しと通信メソッド

ルーティングパラメータ経由

シナリオ: あるコンポーネントは、ルーティングを通じて別のコンポーネントにジャンプできます。例: list

の編集手順:

    AコンポーネントはrouterLink、router.navigate、またはrouter.navigateByUrlを介してBコンポーネントにジャンプします
  1. Bコンポーネントはこれらのパラメータを受け入れます
  2. このメソッドはパラメータの受け渡し、コンポーネントにのみ適用されますパラメータは一度受信すると変更されません

Code

Transferメソッド

routerLink

<a routerLink=["/exampledetail",id]></a>

routerLink=["/exampledetail",{queryParams:object}]

routerLink=["/exampledetail",{queryParams:&#39;id&#39;:&#39;1&#39;,&#39;name&#39;:&#39;yxman&#39;}];
ログイン後にコピー

router.navigate

this.router.navigate([&#39;/exampledetail&#39;,id]);
this.router.navigate([&#39;/exampledetail&#39;],{queryParams:{&#39;name&#39;:&#39;yxman&#39;}});
ログイン後にコピー

router.navigateByUrl

this.router.navigateByUrl(&#39;/exampledetail/id&#39;);
this.router.navigateByUrl(&#39;/exampledetail&#39;,{queryParams:{&#39;name&#39;:&#39;yxman&#39;}});
ログイン後にコピー

パラメータ、2 つの受信方法受信者は次のとおりです。

snapshot

import { ActivateRoute } from &#39;@angular/router&#39;;
public data: any;
export class ExampledetailComponent implements OnInit { 
  constructor( public route: ActivateRoute ) { };
  ngOnInit(){
    this.data = this.route.snapshot.params[&#39;id&#39;];
  };
}
ログイン後にコピー

queryParams

import { ActivateRoute } from &#39;@angular/router&#39;;
export class ExampledetailComponent implements OnInit { 
  public data: any;
  constructor( public activeRoute:ActivateRoute ) { };
  ngOnInit(){
    this.activeRoute.queryParams.subscribe(params => {
    this.data = params[&#39;name&#39;];
  });
};
ログイン後にコピー

Use service Service を使用して通信します。つまり、2 つのコンポーネントが同時にサービスを注入します

シナリオ: 必要な 2 人通信する コンポーネントは、親子コンポーネントや隣接コンポーネントではありません。もちろん、任意のコンポーネントにすることもできます。

手順:

    新しいサービスを作成し、コンポーネント A とコンポーネント B が同時にサービスを挿入します
  1. コンポーネント A はサービスからデータを取得するか、サービスにデータを送信することを要求します
  2. コンポーネント B はサービスからデータを取得するか、サービスにデータを転送したいと考えています。
  3. コード:

  // 组件A
  @Component({
   selector: &#39;app-a&#39;,
   template: &#39;&#39;,
   styles: [``]
  })
  export class AppComponentA implements OnInit {
   constructor(private message: MessageService) {
   }
   ngOnInit(): void {
    // 组件A发送消息3
    this.message.sendMessage(3);
    const b = this.message.getMessage(); // 组件A接收消息;
   }
  }
  // 组件B
  @Component({
   selector: &#39;app-b&#39;,
   template: `
    <app-a></app-a>
   `,
   styles: [``]
  })
  export class AppComponentB implements OnInit {
   constructor(private message: MessageService) {
   }
   ngOnInit(): void {
    // 组件B获得消息
    const a = this.message.getMessage();
    this.message.sendMessage(5); // 组件B发送消息
   }
  }
ログイン後にコピー

メッセージサービスモジュール

シナリオ: これには、すべてのコンポーネントが通信できる必要があるプロジェクト、または 1 つのコンポーネントが複数のコンポーネントに通信を提供する必要があり、パラメーターを渡すことができないプロジェクトが含まれます。ルーティングを通じて。

設計メソッド:

    RxJ を使用してサービス モジュール MessageService を定義し、すべての情報がサービスに登録されます
  1. メッセージを送信する必要がある場合、サービスのメソッドが呼び出されます。情報を受信する必要があります。ローカルで使用し、情報を受信するメソッドを呼び出し、Subscription オブジェクトを取得して、情報をリッスンします
  2. もちろん、各コンポーネントが破棄されると、
  3. this.subscription.unsubscribe();
    ログイン後にコピー
    が必要になります。

    コード:


  // 消息中专服务
  @Injectable()
  export class MessageService {
   private subject = new Subject<any>();
   /**
   * content模块里面进行信息传输,类似广播
   * @param type 发送的信息类型
   *    1-你的信息
   *    2-你的信息
   *    3-你的信息
   *    4-你的信息
   *    5-你的信息
   */
   sendMessage(type: number) {
    console.log(&#39;TAG&#39; + &#39;---------->>>&#39; + type);
    this.subject.next({type: type});
   }
   /**
   * 清理消息
   */
   clearMessage() {
    this.subject.next();
   }
   /**
   * 获得消息
   * @returns {Observable<any>} 返回消息监听
   */
   getMessage(): Observable<any> {
    return this.subject.asObservable();
   }
  }
  // 使用该服务的地方,需要注册MessageService服务;
  constructor(private message: MessageService) {
  }
  // 消息接受的地方;
  public subscription: Subscription;
  ngAfterViewInit(): void {
    this.subscription = this.message.getMessage().subscribe(msg => {
     // 根据msg,来处理你的业务逻辑。
    })
   }

   // 组件生命周期结束的时候,记得注销一下,不然会卡;
   ngOnDestroy(): void {
    this.subscription.unsubscribe();
   }

   // 调用该服务的方法,发送信息;
   send():void {
    this.message.sendMessage(‘我发消息了,你们接受下&#39;); // 发送信息消息
   }
ログイン後にコピー
here MessageService は、ブロードキャスト メカニズムを使用してすべてのコンポーネント間で情報を転送するのと同等であり、情報が数値、文字列、オブジェクトのいずれであっても転送でき、ここでの伝播速度は次のようになります。また非常に速いです。

関連する推奨事項:


nodejs の Express で get 値と post 値を取得する方法とセッション検証を例を挙げて説明します


Vue の親コンポーネントから子に値を動的に渡す 2 つの方法を共有しますコンポーネント

fetchの詳しい説明 使い方とJS値の受け取り方

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート