Angular4 组件中自定义 ngModel

常见的ngmodel的使用场景是在form表单相关的地方,比如inputselect等。不过很多时候我们可能需要定义、封装一些符合自己或者项目的组件,这个时候,组件可能本身就和inputselect等没有太大区别,只是添加了一些自定义的设置,那么如何去实现ngmodel的绑定呢

需求说明

基本的需求可以用如下的代码来解释

<self-def-input [(ngModel)]="value"></self-def-input>

如上所示,我们自定义了一个元素self-def-input。这个元素绑定了一个变量value,我们能够实时的实现value的双向绑定。

实现

看起来,似乎很简单,但是,具体的如何实现呢?

话不多说,上代码:

import { ControlValueAccessor } from '@angular/forms/src/directives';
import { Component, forwardRef, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
@Component({
    selector: 'u-input',
    template: `
      <input [(ngModel)]="value">
    `,
    providers: [
        {
            provide: NG_VALUE_ACCESSOR,
            useExisting: forwardRef(() => UnionInputComponent),
            multi: true
        }
    ]
})
export class UnionInputComponent implements ControlValueAccessor {
    constructor() {}
    private innerValue: any = '';
    private onTouchedCallback: () => void = function(){};
    private onChangeCallback: (_: any) => void = function(){};

    get value(): any {
        return this.innerValue;
    }

    set value(v: any) {
        if (v !== this.innerValue) {
            this.innerValue = v;
            this.onChangeCallback(v);
        }
    }

    writeValue(value: any) {
        if (value !== this.innerValue) {
            this.innerValue = value;
        }
    }

    registerOnChange(fn: any) {
        this.onChangeCallback = fn;
    }
    registerOnTouched(fn: any) {
        this.onTouchedCallback = fn;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,314评论 19 139
  • 一. Java基础部分.................................................
    wy_sure阅读 9,233评论 0 11
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,455评论 0 29
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,898评论 18 399
  • 喜欢是在深夜看书时突然想起他,想象他现在做什么,心里漾起一阵轻飘飘的温暖,却从不主动给他打电话。几分钟后,注意力又...
    青春的眼泪阅读 2,994评论 3 7