zoukankan      html  css  js  c++  java
  • 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>


    最终效果:


    <完>


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

  • 相关阅读:
    webpack2使用ch4-向根目录index.html文件传参并使用参数 使用线上资源 压缩html
    webpack2使用ch3-自动化生成.html和内部引入的js自动更改
    webpack2使用ch2-entry和output简要说明
    webpack2使用ch1-目录说明
    less使用ch1--简单使用
    less使用ch1--认识语法
    vue2购物车ch4-(筛选v-for 点击的那个设置样式 设为默认地址其他 联动 非循环的列表选中和非选中 删除当前选中的列表)
    gulp使用2-gulp-less及watch和错误提示
    gulp使用1-入门指南
    vue2购物车ch3-(过滤器使用 单件商品金额计算 全选全不选 总金额计算 删除商品功能)
  • 原文地址:https://www.cnblogs.com/long328583644/p/7142110.html
Copyright © 2011-2022 走看看