Home > Web Front-end > JS Tutorial > Detailed explanation of several methods of communication between components in Angular

Detailed explanation of several methods of communication between components in Angular

青灯夜游
Release: 2021-04-25 19:09:26
forward
2489 people have browsed it

This article will give you a detailed understanding of the various types of communication between components in Angular. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

Detailed explanation of several methods of communication between components in Angular

Communication between Angular components


Three typical relationships between components:
Detailed explanation of several methods of communication between components in Angular

  • Interaction between parent components (@Input/@Output/template variable/@ViewChild)

  • Interaction between non-parent and child components ( Service/localStorage)

  • You can also use Session and routing parameters for communication, etc.

Recommended related tutorials: "angular tutorial

Interaction between parent and child components

Writing of child components

  • 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);
  }

}
Copy after login
  • 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>
Copy after login

Parent component

  • 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);
  }

}
Copy after login
  • 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>
Copy after login

@Input Property binding is one-way Yes, changes in the properties of the parent component will affect changes in the properties of the child component, but changes in the properties of the child component will not in turn affect changes in the properties of the parent component.

However, you can use @Input() and @Output() to achieve two-way binding of properties.

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

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

Note: When using [()] for two-way binding, the output attribute name must be composed of the input attribute name and Change, in the form: xxxChange.

Interaction between non-parent and child components

Use Service for interaction

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

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

  constructor() { }
}
Copy after login
  • 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;);
  }
}
Copy after login
  • 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>
Copy after login
  • 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);
    });
  }
}
Copy after login
  • 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>
Copy after login
  • 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 {
  }

}
Copy after login
  • 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>
Copy after login

Use localStorage to interact

    ##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}));
      }
    
    }
    Copy after login
    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>
    Copy after login
    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);
      }
    
    }
    Copy after login
    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>
    Copy after login
    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 {
      }
    
    }
    Copy after login
    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>
    Copy after login
    Finally, the method of using Session and routing parameters to achieve data interaction will not be demonstrated here.

    For more programming related knowledge, please visit:

    Programming Video! !

    The above is the detailed content of Detailed explanation of several methods of communication between components in Angular. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template