angular组件间传值与通信使用详解

这次给大家带来angular组件间传值与通信使用详解,angular组件间传值与通信的注意事项有哪些,下面就是实战案例,一起来看一下。

本文主要介绍angular在不同的组件中如何进行传值,如何通讯。主要分为父子组件和非父子组件部分。

父子组件间参数与通讯方法

使用事件通信(EventEmitter,@Output):

场景:可以在父子组件之间进行通信,一般使用在子组件传递消息给父组件;

步骤:

子组件创建事件EventEmitter对象,使用@output公开出去;

父组件监听子组件@output出来的方法,然后处理事件。

代码:

 // child 组件  @Component({   selector: 'app-child',   template: '',   styles: [``]  })  export class AppChildComponent implements OnInit {   @Output() onVoted: EventEmitter = new EventEmitter();   ngOnInit(): void {    this.onVoted.emit(1);   }  }  // parent 组件  @Component({   selector: 'app-parent',   template: `       `,   styles: [``]  })  export class AppParentComponent implements OnInit {   ngOnInit(): void {    throw new Error('Method not implemented.');   }   onListen(data: any): void {    console.log('TAG' + '---------->>>' + data);   }  }

登录后复制

使用@ViewChild和@ViewChildren:

场景:一般用于父组件给子组件传递信息,或者父组件调用子组件的方法;

步骤:

父组件里面使用子组件

父组件里面使用@ViewChild获得子组件对象。

父组件使用子组件对象操控子组件;(传递信息或者调用方法)。

代码:

// 子组件@Component({ selector: 'app-child', template: '', styles: [``]})export class AppChildComponent2 implements OnInit {  data = 1;  ngOnInit(): void { } getData(): void {  console.log('TAG' + '---------->>>' + 111); }}// 父组件@Component({ selector: 'app-parent2', template: `   `, styles: [``]})export class AppParentComponent2 implements OnInit { @ViewChild(AppChildComponent2) child: AppChildComponent2; ngOnInit(): void {  this.child.getData(); // 父组件获得子组件方法  console.log('TAG'+'---------->>>'+this.child.data);// 父组件获得子组件属性 }}

登录后复制

非父子组件参数传递与通讯方法

通过路由参数

场景:一个组件可以通过路由的方式跳转到另一个组件 如:列表与编辑

步骤:

A组件通过routerLink或router.navigate或router.navigateByUrl进行页面跳转到B组件

B组件接受这些参数

此方法只适用于参数传递,组件间的参数一旦接收就不会变化

代码

传递方式

routerLink

routerLink=["/exampledetail",{queryParams:object}]routerLink=["/exampledetail",{queryParams:'id':'1','name':'yxman'}];

登录后复制

router.navigate

this.router.navigate(['/exampledetail',id]);this.router.navigate(['/exampledetail'],{queryParams:{'name':'yxman'}});

登录后复制

router.navigateByUrl

this.router.navigateByUrl('/exampledetail/id');this.router.navigateByUrl('/exampledetail',{queryParams:{'name':'yxman'}});

登录后复制

传参方传参之后,接收方2种接收方式如下:

snapshot

import { ActivateRoute } from '@angular/router';public data: any;export class ExampledetailComponent implements OnInit {   constructor( public route: ActivateRoute ) { };  ngOnInit(){    this.data = this.route.snapshot.params['id'];  };}

登录后复制

queryParams

import { ActivateRoute } from '@angular/router';export class ExampledetailComponent implements OnInit {   public data: any;  constructor( public activeRoute:ActivateRoute ) { };  ngOnInit(){    this.activeRoute.queryParams.subscribe(params => {    this.data = params['name'];  });};

登录后复制

使用服务Service进行通信,即:两个组件同时注入某个服务

场景:需要通信的两个组件不是父子组件或者不是相邻组件;当然,也可以是任意组件。

步骤:

新建一个服务,组件A和组件B同时注入该服务;

组件A从服务获得数据,或者想服务传输数据

组件B从服务获得数据,或者想服务传输数据。

代码:

  // 组件A  @Component({   selector: 'app-a',   template: '',   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: 'app-b',   template: `       `,   styles: [``]  })  export class AppComponentB implements OnInit {   constructor(private message: MessageService) {   }   ngOnInit(): void {    // 组件B获得消息    const a = this.message.getMessage();    this.message.sendMessage(5); // 组件B发送消息   }  }

登录后复制

消息服务模块

场景:这里涉及到一个项目,里面需要实现的是所有组件之间都有可能通信,或者是一个组件需要给几个组件通信,且不可通过路由进行传参。

设计方式:

使用RxJs,定义一个服务模块MessageService,所有的信息都注册该服务;

需要发消息的地方,调用该服务的方法;

需要接受信息的地方使用,调用接受信息的方法,获得一个Subscription对象,然后监听信息;

当然,在每一个组件Destory的时候,需要

this.subscription.unsubscribe();

登录后复制

代码:

  // 消息中专服务  @Injectable()  export class MessageService {   private subject = new Subject();   /**   * content模块里面进行信息传输,类似广播   * @param type 发送的信息类型   *    1-你的信息   *    2-你的信息   *    3-你的信息   *    4-你的信息   *    5-你的信息   */   sendMessage(type: number) {    console.log('TAG' + '---------->>>' + type);    this.subject.next({type: type});   }   /**   * 清理消息   */   clearMessage() {    this.subject.next();   }   /**   * 获得消息   * @returns {Observable} 返回消息监听   */   getMessage(): Observable {    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(‘我发消息了,你们接受下'); // 发送信息消息   }

登录后复制

这里的MessageService,就相当于使用广播机制,在所有的组件之间传递信息;不管是数字,字符串,还是对象都是可以传递的,而且这里的传播速度也是很快的。 

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

js封装操作class步奏详解

标签selected=”selected”属性失效如何处理

以上就是angular组件间传值与通信使用详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2772003.html

(0)
上一篇 2025年3月8日 13:07:56
下一篇 2025年3月7日 10:42:24

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Vue全家桶项目实践详解

    这次给大家带来Vue全家桶项目实践详解,使用Vue全家桶实现项目的注意事项有哪些,下面就是实战案例,一起来看一下。 从前端的角度看,Vue可以说是目前最理想的前端MVVM框架,一切为界面服务,上手难度低,本文就将记录使用Vue全家桶(Vue…

    编程技术 2025年3月8日
    200
  • Vuex状态管理应如何使用

    这次给大家带来Vuex状态管理应如何使用,Vuex状态管理使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状…

    编程技术 2025年3月8日
    200
  • Angular 5新手必知

    这次给大家带来Angular 5新手必知,Angular 5新手使用的注意事项有哪些,下面就是实战案例,一起来看一下。 尽管被称为Angular5,实际上它只是这个诞生于2012年的前端框架的的第四个版本: angular history …

    编程技术 2025年3月8日
    200
  • JS按钮禁用和启用使用详解

    这次给大家带来JS按钮禁用和启用使用详解,使用JS按钮禁用和启用的注意事项有哪些,下面就是实战案例,一起来看一下。 废话不多说了,直接给大家贴代码了,具体代码如下所述: 按钮启用和禁用function btn1(){ document.ge…

    编程技术 2025年3月8日
    200
  • multer上传如何使用

    这次给大家带来multer上传如何使用,multer上传使用的注意事项有哪些,下面就是实战案例,一起来看一下。 收获还是蛮多的,主要在于wenpack使用的一些细节问题,有点茅塞顿悟的体验吧,另外在node上也不再一脸懵逼了。不过说实话,以…

    编程技术 2025年3月8日
    200
  • vue中v-model动态使用详解

    这次给大家带来vue中v-model动态使用详解,vue中v-model动态使用的注意事项有哪些,下面就是实战案例,一起来看一下。 前言: 最近在做公司的项目中,有这么一个需求,每一行有一个input和一个select,其中行数是根据服务器…

    编程技术 2025年3月8日
    200
  • vue-resource拦截器设置头信息的步奏详解

    这次给大家带来,的注意事项有哪些,下面就是实战案例,一起来看一下。 使用vue-resource,设置头信息: Vue.http.interceptors.push((request, next) => { request.heade…

    编程技术 2025年3月8日
    200
  • 在vue2中使用ref步奏详解

    这次给大家带来在vue2中使用ref步奏详解,在vue2中使用ref的注意事项有哪些,下面就是实战案例,一起来看一下。 本文介绍了vue2里面ref的具体使用方法,分享给大家,具体如下。 1、我们先定义两个组件 html部分 登录后复制 j…

    编程技术 2025年3月8日
    200
  • AngularJS环境搭建步奏详解

    这次给大家带来AngularJS环境搭建步奏详解,AngularJS环境搭建的注意事项有哪些,下面就是实战案例,一起来看一下。 AngularJS是什么? AngularJS是一个开源Web应用程序框架。它最初是由MISKO Hevery和…

    编程技术 2025年3月8日
    200
  • Require调用js使用详解

    这次给大家带来Require调用js使用详解,Require调用js的注意事项有哪些,下面就是实战案例,一起来看一下。 在我最初开始写 JavaScript 函数时,通常是这样的: function fun1() { // some cod…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论