在Angular中共享数据的方式

现在我正在学习Angular,为了在工作中使用。因为Angular有几种数据共享的方式,所以我打算发布这篇文章来整理我的理解。如果有错误,请指正。

在Angular中的数据共享方法

在Angular中,主要有以下方法来共享数据。

@Input,@Outputを使用した、親コンポーネントと子コンポーネント間でのデータ共有
URLパラメータ化
サービスの使用

父组件和子组件之间的数据共享

在Angular中,当父组件和子组件需要共享数据时,可以使用@Input和@Output。以下是具体的使用示例。

将父组件的数据与子组件共享

在这里,我们设定父组件为top.component.ts,子组件为header.component.ts。

import { Component } from '@angular/core';

@Component({
  selector: 'app-top',
  templateUrl: './top.component.html',
  styleUrls: ['./top.component.css']
})
export class TopComponent {
  //子コンポーネントと共有したい変数
  sharedItem:string=""; 
}
<app-header [item]="sharedItem"></app-header>
<input type="text" [(ngModel)]="this.sharedItem">
import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent {
  //親コンポーネントから共有されるデータを受け取る
  @Input() item = '';
}
<p>
  Shared item: {{item}}
</p>

在父组件中定义要与子组件共享的变量。然后,在父HTML中如下定义。

<selector名 [子コンポーネントで受け取る名]="親コンポーネントで定義した変数名"><</selector名>

如果我们定义这样的话,可以在父母和孩子之间共享数据。这次我们设置了用户输入内容显示在sharedItem中。

スクリーンショット 2023-11-03 16.40.56.png

将子组件的数据与父组件共享

下面将总结一种与之前相反的方法,即将子组件的数据共享给父组件。

<label for="item-input">Add an item:</label>
<input type="text" id="item-input" #newItem>
<button type="button" (click)="addNewItem(newItem.value)">Add to parent's list</button>
import { Component, EventEmitter, Input, Output } from '@angular/core';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css']
})
export class HeaderComponent {
  @Output() newItemEvent = new EventEmitter<string>();

  addNewItem(value: string) {
    this.newItemEvent.emit(value);
  }
}

在子组件中,我们可以使用@Output来通知父组件事件。在这种情况下,我们可以使用自定义事件定义和EventEmitter。以下文章对EventEmitter进行了简明扼要的总结,非常易懂。

 

点击按钮后,将用户的输入值通知给父组件。
接下来,我们来总结一下父组件的情况。

import { Component } from '@angular/core';

@Component({
  selector: 'app-top',
  templateUrl: './top.component.html',
  styleUrls: ['./top.component.css']
})
export class TopComponent {
  items = ['item1', 'item2', 'item3', 'item4'];

  addItem(newItem: string) {
    this.items.push(newItem);
  }
}

亲组件将接收到的输入值接收。

<app-header (newItemEvent)="addItem($event)"></app-header>
<ul>
  <li *ngFor="let item of items">{{item}}</li>
</ul>
<selector名 (子コンポーネントで定義したイベント名)="親コンポーネントで定義したメソッド"></selector名>

通过这种方式将子组件的数据传递给父组件。

在URL的参数中共享

如果希望在从画面A转移到下一个画面B时将画面A中的输入内容等带到画面B,可以将要共享的信息作为URL参数传递。
以下的文章中有很好的总结解释。

 

使用服务

如果在家庭成员之间共享数据,可以使用@Input和@Output,但这些数据会在组件初始化时进行初始化。由于服务是单例的,除非重新启动或停止应用程序,否则数据不会被初始化。同时,也可以集中管理数据。在涉及页面跳转的情况下(组件会被初始化,无法使用@Input和@Output),我使用服务来共享数据。

在这里,我们使用share.service.ts来在service1.component.ts和service2.component.ts之间共享数据。

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class ShareService {
  message:string;

  constructor() { }

  getMessage(){
    return this.message;

  }

  setMessage(message:string){
    this.message=message;
  }

}

接下来展示service1.component.ts和service2.component.ts。

import { ShareService } from './../../../service/share.service';
import { Component } from '@angular/core';

@Component({
  selector: 'app-service1',
  templateUrl: './service1.component.html',
  styleUrls: ['./service1.component.css']
})
export class Service1Component {
  message:string;
  constructor(private shareService:ShareService){}

  setMessage(){
    this.shareService.setMessage(this.message);
  }

}
<p>共有したい言葉を入れてください</p>
  <input type="text" name="message" [(ngModel)]="message">
  <button (click)="setMessage()">共有</button>
  <div *ngIf="message">{{message}}がサービスにセットされました</div>
<app-service2></app-service2>

スクリーンショット 2023-11-03 18.23.00.png

在service1组件中,当用户点击”共享”按钮时,会通过setMessage方法将用户输入的文字设置到share.service.ts文件中的message变量中。

接下来,我会展示service2组件。

import { Component } from '@angular/core';
import { ShareService } from 'src/service/share.service';

@Component({
  selector: 'app-service2',
  templateUrl: './service2.component.html',
  styleUrls: ['./service2.component.css']
})
export class Service2Component {
  message:string;
  constructor(private shareService:ShareService){}
  
  getMessage(){
    this.message=this.shareService.getMessage();
  }
}
<p>共有した言葉を表示する</p>
<button (click)="getMessage()">表示</button>
<div *ngIf="message">{{message}}がサービスにセットされています</div>
スクリーンショット 2023-11-03 18.27.06.png

点击”表示”按钮时,通过getMessage方法,在share.service.ts中显示用户输入的消息。

通过使用这种服务,您可以在不同的组件之间共享数据。由于服务在应用程序重新启动或停止之前会一直保持数据,因此需要注意不小心设置了意外数据的情况。(在另一个处理中无意间浪费了时间,没有意识到服务中共享的值存在。。。)

提供的资料

 

广告
将在 10 秒后关闭
bannerAds