• Angular2父子组件之间数据传递:父子组件共享服务通信 2017-07-09 17:06 6人阅读 评论(0) 收藏


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

    首先定义服务:
    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>


    最终效果:


    <完>


    个人学习心得,大神路过,不喜勿喷

  • 相关阅读:
    【DS】仓库里的财宝(线段树+分块)
    【图论】树链剖分
    Java基础之:集合——Collection——Set
    Java基础之:List——LinkedList
    Java基础之:List——ArrayList & Vector
    Java基础之:集合——Collection——List
    Java基础之:集合——Collection
    Java基础之:日期类
    Java基础之:大数
    Java基础之:Math & Arrays & System
  • 原文地址:https://www.cnblogs.com/long328583644/p/7142110.html
Copyright © 2020-2023  润新知