Angular2父子组件之间数据传递:父子组件共享服务通信

来源:互联网 发布:百度关键词优化 编辑:程序博客网 时间:2024/06/14 03:40

​父子组件共享同一个服务,利用该服务实现双向通信

首先定义服务:
parentService.ts(服务)

import {Injectable} from "@angular/core"

@Injectable()
export class ParentService {
name: string = "小明";

 
getData() {
return this.name;
 
}
}

(1).这里用Injectable修饰这个类是一个服务,在其他用到地方只需要注入使用

(2).我们还定义了一个name变量并且初始化值,和一个公共的方法getData

parent.module.ts(模块)

import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {FormsModule} from '@angular/forms';
import {ParentComponent} from './parent.component';
import {ChildenComponent} from './childen/childen.component'
import {ParentService} from './parent.service'

@NgModule({
imports: [CommonModule, FormsModule],
 
exports: [ParentComponent],
 
declarations: [ParentComponent, ChildenComponent],
 
providers: [ParentService]
})
export class ParentModule {
}

们这里把刚才创建的parentService服务依赖加进来,接着在provides中注册这个parentService服务,在ParentModule模块中注册之后,对于父组件和子组件来说都是指向同一个服务实例,而且这个服务的作用域只在当前这个模块中有效,这句话理解了,就等于理解了父子组件共享服务实现数据通信


在父组件中使用服务

parent.component.ts(父组件)

import {Component} from '@angular/core';
import  {ParentService} from './parent.service';

@Component({
selector: 'app-parent',
 
templateUrl: './parent.component.html',
 
styleUrls: ['./parent.component.css'],
})
export class ParentComponent {
constructor(public parentService: ParentService) {
}

OnClick() {
let a = this.parentService.getData();
   
alert(a);
 
}
}

导入parentService服务,在构造函数中声明注入parentService服务,因为我们在parentModule模块中,已经将parentService 通过provides注册过,所以我们在组件中不需要进行注册,直接可以使用,你可以这样理解,把当它想象成在模块的容器中已经存在了,只需要从容器中拿出来使用。
(1).这里我们定义了一个OnClick()方法,当页面点击事件触发,就会来调用parentService服务定义的方法getData()获取返回值,弹出返回值。
对应的父组件模版是这样的

<div class="parent_div">
 <p>父组件</p>
 <div>
   <input type="button" value="父组件调用服务方法" (click)="OnClick()">
 </div>
 <!---子组件指令 start-->
 <app-childen></app-childen>
 <!---子组件指令 end-->
</div>


最终效果



在子组件中使用服务

因为共享的是同一个ParentService服务实例,所以我们在子组件中也可以调用个ParentService服务的方法,代码同上面用一样

childen.component.ts(子组件)

import {Component} from '@angular/core';
import {ParentService} from '../parent.service'


@Component({
selector: 'app-childen',
 templateUrl: './childen.component.html',
 styleUrls: ['./childen.component.css']
})
export class ChildenComponent {
constructor(private parentService: ParentService) {
}

fun1() {
let a = this.parentService.getData();
   alert(a);
 }

}

这里同样定义了一个方法,用于测试调用parentService服务,代码实现跟上面一样,不在描述,对应的子组件模版

<div class="childen-box">
 <p>子组件</p>
 <div>
   <input type="button" value="子组件调用服务方法" (click)="fun1()">
 </div>
</div>


最终效果:



 

个人学习心得,大神路过 ,不喜勿喷
有问题加我微信提问或者留言



阅读全文
0 0