父子组件共享同一个服务,利用该服务实现双向通信
首先定义服务:
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>
最终效果:
个人学习心得,大神路过 ,不喜勿喷
有问题加我微信提问或者留言