Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung verschiedener Kommunikationsmethoden zwischen Komponenten in Angular

Detaillierte Erläuterung verschiedener Kommunikationsmethoden zwischen Komponenten in Angular

青灯夜游
青灯夜游nach vorne
2021-04-25 10:19:582481Durchsuche

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis der verschiedenen Arten der Kommunikation zwischen Komponenten in Angular. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Detaillierte Erläuterung verschiedener Kommunikationsmethoden zwischen Komponenten in Angular

Kommunikation zwischen Angular-Komponenten


Drei typische Beziehungen zwischen Komponenten:
Detaillierte Erläuterung verschiedener Kommunikationsmethoden zwischen Komponenten in Angular

  • Interaktion zwischen übergeordneten Komponenten (@Input/@Output/Vorlagenvariable/@ViewChild)

  • Inter Aktion zwischen nicht -Eltern-Kind-Komponenten (Service/localStorage)
  • Sie können auch Sitzungs- und Routing-Parameter für die Kommunikation usw. verwenden.
  • Empfohlene Tutorials: „
Angular-Tutorial

Eltern-Kind-Komponenten Interaktion zwischen Schreiben von untergeordneten Komponenten t s
@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);
  }

}
parent-and-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>
@Eingabeattributbindung ist einseitig. Die Attributänderungen der übergeordneten Komponente wirken sich auf die Attributänderungen der untergeordneten Komponente aus, und die Attributänderungen der untergeordneten Komponente wirken sich aus Eigenschaftsänderungen, die sich auf die übergeordnete Komponente auswirken, können nicht rückgängig gemacht werden.

Sie können jedoch @Input() und @Output() verwenden, um eine bidirektionale Bindung von Eigenschaften zu erreichen.
    @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);
      }
    
    }
  • Hinweis:
Bei Verwendung von
    für die bidirektionale Bindung muss der Ausgabeattributname aus dem Eingabeattributnamen und der Änderung in der Form xxxChange bestehen.
Interaktion zwischen nicht übergeordneten und untergeordneten Komponenten

Verwenden Sie den Dienst zur Interaktion
event-bus.service.ts
  • <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>
child1.component.ts

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

// 实现双向绑定
<input [(value)] = "newValue"></input>

child1. Komponente.html

/**
 * 用于充当事件总线
 */
@Injectable()
export class EventBusService {

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

  constructor() { }
}
[()]child2.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;);
  }
}
child2.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>
brother.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);
        });
      }
    }
  • brother.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>
  • Verwenden Sie localStorage zur Interaktion
  • local-child1.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 {
      }
    
    }
  • local-child1.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>
  • local-child2.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}));
      }
    
    }
  • local-child2.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>
  • local -storage.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);
  }

}
local-storage.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>
  • Abschließend wird die Methode zur Verwendung von Sitzungs- und Routing-Parametern zur Erzielung einer Dateninteraktion hier nicht demonstriert.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter:
    Programmiervideos
  • ! !

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung verschiedener Kommunikationsmethoden zwischen Komponenten in Angular. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen