angular模块间通信,angular组件调用组件方法

  angular模块间通信,angular组件调用组件方法

  本篇文章带大家继续有角的的学习,了解一下有角的中组件通信的方法,希望对大家有所帮助!

  上一篇,我们讲了有角的结合NG-佐罗快速开发。前端开发,很大程度上是组件化开发,永远离不开组件之间的通信。那么,在有角的开发中,其组件之间的通信是怎么样的呢?【相关教程推荐: 《angular教程》 】

  本文纯文字,比较枯燥。因为控制台打印的东西比较鸡肋,所以就不配图了,嗯~希望读者跟着说明代码走一遍更容易吸收~

  

1. 父组件通过属性传递值给子组件

   相当于你自定义了一个属性,通过组件的引入,将值传递给子组件给你看代码。

  !parent.component.html

  app-child [parentProp]= 我的孩子“%”/app-child在父组件中调用子组件,这里命名一个parentProp的属性。

  //child.component.ts

  从" @角度/核心"导入{ Component,OnInit,Input };

  @组件({

  选择器:"应用程序-子代",

  templateUrl:“”./child.component.html ,

  样式URL:[ ./child.component.scss]

  })

  导出类子组件实现OnInit {

  //输入装饰器

  @Input()

  parentProp!字符串;

  构造函数(){ }

  ngOnInit(): void {

  }

  }子组件接受父组件传入的变量parentProp,回填到页面。

  !child.component.html

  氕你好!{{ parentProp }}/h1

2. 子组件通过 Emitter 事件传递信息给父组件

  通过新事件发射器()将子组件的数据传递给父组件。

  //child.component.ts

  从" @角度/核心"导入{ Component,OnInit,Output,事件发射器}。

  @组件({

  选择器:"应用程序-子代",

  templateUrl:“”./child.component.html ,

  样式URL:[ ./child.component.scss]

  })

  导出类子组件实现OnInit {

  //输出装饰器

  @Output()

  private childSayHi=新事件发射器()

  构造函数(){ }

  ngOnInit(): void {

  this.childSayHi.emit(我的父母);

  }

  }通过发射通知父组件,父组件对事件进行监听。

  //parent.component.ts

  从" @角度/核心"导入{组件,在init }上。

  @组件({

  选择器:"应用程序-交流",

  templateUrl:“”./communicate.component.html ,

  样式URL:[ ./communicate.component.scss]

  })

  导出类通信组件实现OnInit {

  公共消息:string=

  构造函数(){ }

  ngOnInit(): void {

  }

  fromChild(数据:字符串){

  //这里使用异步

  setTimeout(()={

  this.msg=数据

  }, 50)

  }

  }在父组件中,我们对儿童组件来的数据进行监听后,这里采用了定时器的异步操作。是因为我们在子组件中初始化后就进行了发射,这里的异步操作是防止竞态条件竞争出错。

  我们还得在组件中添加来自儿童这个方法,如下:

  !parent.component.html

  氕你好!{{ msg }}/h1

  app-child(childSayHi)= from child($ event)/app-child

3. 通过引用,父组件获取子组件的属性和方法

  我们通过操纵引用的方式,获取子组件对象,然后对其属性和方法进行访问。

  我们先设置子组件的演示内容:

  //child.component.ts

  从" @角度/核心"导入{组件,在init }上。

  @组件({

  选择器:"应用程序-子代",

  templateUrl:“”./child.component.html ,

  样式URL:[ ./child.component.scss]

  })

  导出类子组件实现OnInit {

  //子组件的属性

  public child msg:string= Prop:message from child

  构造函数(){ }

  ngOnInit(): void {

  }

  //子组件方法

  public childSayHi(): void {

  控制台。日志(方法:我是你的孩子。)

  }

  }我们在父组件上设置子组件的引用标识#子组件:

  !parent.component.html

  应用程序-子#子组件/应用程序-子之后在爪哇岛描述语言文件上调用:

  从" @角度/核心"导入{ Component,OnInit,view child }。

  从""导入{ ChildComponent } ./组件/子组件/子组件。组件;

  @组件({

  选择器:"应用程序-交流",

  templateUrl:“”./communicate.component.html ,

  样式URL:[ ./communicate.component.scss]

  })

  导出类通信组件实现OnInit {

  @ViewChild(childComponent )

  childComponent!子组件

  构造函数(){ }

  ngOnInit(): void {

  this.getChildPropAndMethod()

  }

  getchildproandmethod():void {

  setTimeout(()={

  控制台。日志(这个。子组件。子消息);//道具:来自子级的消息

  这个。子组件。childsayhi();//方法:我是你的孩子。

  }, 50)

  }

  }这种方法有个限制?就是子属性的修饰符需要是公共的,当是保护或者私人的的时候,会报错。你可以将子组件的修饰符更改下尝试。报错的原因如下:

  类型使用范围公众的允许在累的内外被调用,作用范围最广保护允许在类内以及继承的子类中使用,作用范围适中私人的允许在类内部中使用,作用范围最窄

4. 通过 service 去变动

   我们结合rxjs来演示。

  rxjs是使用看得见的的响应式编程的库,它使编写异步或基于回调的代码更容易。

  我们先来创建一个名为父母和孩子的服务。

  //亲子。服务。分时(同timesharing)

  从" @角度/核心"导入{内射};

  从" rxjs "导入{行为主体,可观察};//行为主体有实时的作用,获取最新值

  @可注射({

  提供了:"根"

  })

  导出类ParentAndChildService {

  私有subject $:行为主体any=新行为主体(空)

  构造函数(){ }

  //将其变成可观察

  getMessage(): Observableany {

  返回这个. subject美元.asObservable()

  }

  setMessage(msg: string) {

  这个. subject美元.下一个(味精);

  }

  }接着,我们在父子组件中引用,它们的信息是共享的。

  //parent.component.ts

  从" @角度/核心"导入{ Component,OnDestroy,on init }。

  //引入服务

  从“src/app/services/亲子。服务"导入{ ParentAndChildService };

  从" rxjs "导入{主题}

  从" rxjs/运算符"导入{ takeUntil }

  @组件({

  选择器:"应用程序-交流",

  templateUrl:“”./communicate.component.html ,

  样式URL:[ ./communicate.component.scss]

  })

  导出类通信组件实现OnInit,OnDestroy {

  unsubscribe $:Subject boolean=new Subject();

  构造器(

  私人的只读parentAndChildService:parentAndChildService

  ) { }

  ngOnInit(): void {

  这个。parentandchildservice。getmessage()。管道(

  takeUntil(this.unsubscribe$)

  )。订阅({

  下一步:(消息:任何)={

  控制台。log( Parent: msg );

  //刚进来打印父:空

  //一秒后打印家长:吉米

  }

  });

  setTimeout(()={

  这个。parentandchildservice。设置消息(“Jimmy”);

  }, 1000)

  }

  ngOnDestroy() {

  //取消订阅

  this.unsubscribe美元。下一个(真);

  this.unsubscribe美元。完成();

  }

  }从" @角度/核心"导入{组件,在init }上。

  从“src/app/services/亲子。服务"导入{ ParentAndChildService };

  @组件({

  选择器:"应用程序-子代",

  templateUrl:“”./child.component.html ,

  样式URL:[ ./child.component.scss]

  })

  导出类子组件实现OnInit {

  构造器(

  private parentAndChildService:parentAndChildService

  ) { }

  //为了更好理解,这里我移除了父组件的科目

  ngOnInit(): void {

  这个。parentandchildservice。getmessage()。订阅({

  下一步:(消息:任何)={

  控制台。log( Child: msg );

  //刚进来打印子代:空

  //一秒后打印孩子:吉米

  }

  })

  }

  }在父组件中,我们一秒钟之后更改值。所以在父子组件中,一进来就会打印味精的初始值空,然后过了一秒钟之后,就会打印更改的值吉米。同理,如果你在子组件中对服务的信息,在子组件打印相关的值的同时,在父组件也会打印。

  【完】

  更多编程相关知识,请访问:编程入门!以上就是聊聊有角的中组件之间怎么通信的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: