Maison > interface Web > js tutoriel > Explication détaillée de plusieurs méthodes de communication entre composants dans Angular

Explication détaillée de plusieurs méthodes de communication entre composants dans Angular

青灯夜游
Libérer: 2021-04-25 19:09:26
avant
2542 Les gens l'ont consulté

Cet article vous donnera une compréhension détaillée des différents types de communication entre les composants dans Angular. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Explication détaillée de plusieurs méthodes de communication entre composants dans Angular

Communication entre composants angulaires


Trois relations typiques entre composants :
Explication détaillée de plusieurs méthodes de communication entre composants dans Angular

  • Interaction entre les composants parents et bons (@Input/@Output/template variables/@ViewChild)

  • Interaction entre les composants non parents et enfants (Service/ localStorage)

  • Vous pouvez également utiliser les paramètres de session et de routage pour la communication, etc.

Tutoriels associés recommandés : "tutoriel angulaire

Interaction entre les composants parents et enfants

Écriture des composants enfants

  • 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(&#39;我是子组件&#39;);
  }

  childFunction(): void {
    console.log(&#39;子组件的名字是:&#39; + this.childTitle);
  }

}
Copier après la connexion
  • 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>
Copier après la connexion

Composant parent

  • parent-and-child.component.ts
@Component({
  selector: &#39;app-parent-and-child&#39;,
  templateUrl: &#39;./parent-and-child.component.html&#39;,
  styleUrls: [&#39;./parent-and-child.component.css&#39;]
})
export class ParentAndChildComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

  doSomething(event: any): void {
    alert(event);
  }

}
Copier après la connexion
  • 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>
Copier après la connexion

@La liaison d'attribut d'entrée est une- Oui, les modifications de propriété du composant parent affecteront les modifications de propriété du composant enfant, mais les modifications de propriété du composant enfant n'affecteront pas à leur tour les modifications de propriété du composant parent.

Cependant, vous pouvez utiliser @Input() et @Output() pour obtenir une liaison bidirectionnelle des propriétés.

@Input()
value: string;
@Output()
valueChange: EventEmitter<any> = new EventEmitter();

// 实现双向绑定
<input [(value)] = "newValue"></input>
Copier après la connexion

Remarque : Lors de l'utilisation de [()] pour une liaison bidirectionnelle, le nom de l'attribut de sortie doit être composé du nom de l'attribut d'entrée et de Change, sous la forme : xxxChange.

Interaction entre les composants non parents et enfants

Utiliser le service pour interagir

  • event-bus.service .ts
/**
 * 用于充当事件总线
 */
@Injectable()
export class EventBusService {

  evnetBus: Subject<string> = new Subject<string>();

  constructor() { }
}
Copier après la connexion
  • child1.component.ts
@Component({
  selector: &#39;app-child1&#39;,
  templateUrl: &#39;./child1.component.html&#39;,
  styleUrls: [&#39;./child1.component.css&#39;]
})
export class Child1Component implements OnInit {

  constructor(private eventBusService: EventBusService) { }

  ngOnInit(): void {
  }

  triggerEventBus(): void {
    this.eventBusService.evnetBus.next(&#39;child1 触发的事件&#39;);
  }
}
Copier après la connexion
  • 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>
Copier après la connexion
  • child2 .component.ts
@Component({
  selector: &#39;app-child2&#39;,
  templateUrl: &#39;./child2.component.html&#39;,
  styleUrls: [&#39;./child2.component.css&#39;]
})
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);
    });
  }
}
Copier après la connexion
  • 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>
Copier après la connexion
  • brother.component.ts
@Component({
  selector: &#39;app-brother&#39;,
  templateUrl: &#39;./brother.component.html&#39;,
  styleUrls: [&#39;./brother.component.css&#39;]
})
export class BrotherComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

}
Copier après la connexion
  • 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>
Copier après la connexion

Utilisez localStorage pour interagir

  • local-child1.component.ts
@Component({
  selector: &#39;app-local-child1&#39;,
  templateUrl: &#39;./local-child1.component.html&#39;,
  styleUrls: [&#39;./local-child1.component.css&#39;]
})
export class LocalChild1Component implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

  writeData(): void {
    window.localStorage.setItem(&#39;message&#39;, JSON.stringify({name: &#39;star&#39;, age: 22}));
  }

}
Copier après la connexion
  • 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>
Copier après la connexion
  • local-child2.component.ts
@Component({
  selector: &#39;app-local-child2&#39;,
  templateUrl: &#39;./local-child2.component.html&#39;,
  styleUrls: [&#39;./local-child2.component.css&#39;]
})
export class LocalChild2Component implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

  readData(): void {
    const dataStr = window.localStorage.getItem(&#39;message&#39;);
    const data = JSON.parse(dataStr);
    console.log(&#39;name:&#39; + data.name, &#39;age:&#39; + data.age);
  }

}
Copier après la connexion
  • 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>
Copier après la connexion
  • local-storage.component.ts
@Component({
  selector: &#39;app-local-storage&#39;,
  templateUrl: &#39;./local-storage.component.html&#39;,
  styleUrls: [&#39;./local-storage.component.css&#39;]
})
export class LocalStorageComponent implements OnInit {

  constructor() { }

  ngOnInit(): void {
  }

}
Copier après la connexion
  • 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>
Copier après la connexion

Enfin, la méthode d'utilisation des paramètres de session et de routage pour réaliser une interaction de données ne sera pas démontrée ici.

Pour plus de connaissances sur la programmation, veuillez visiter : Vidéo de programmation ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal