gpt4 book ai didi

angular - 触摸/未触摸未在自定义输入组件中更新 - Angular 2

转载 作者:太空狗 更新时间:2023-10-29 16:56:33 26 4
gpt4 key购买 nike

我有一个自定义输入组件,它正在更新验证和状态,触摸/未触摸除外。其他所有状态(原始/脏)都按预期工作。

这是一个傻瓜:https://plnkr.co/edit/O9KWzwhjvySnXd7vyo71

import { Component, OnInit, Input, ElementRef, forwardRef, Renderer } from '@angular/core';
import { REACTIVE_FORM_DIRECTIVES, Validator, Validators, NG_VALUE_ACCESSOR, ControlValueAccessor} from '@angular/forms';



export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = /*@ts2dart_const*/ {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputComponent),
multi: true
};

const noop = () => {};

@Component({
selector: 'my-custom-input',
providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR],
template: `
<div class="form-group">
<label>CUSTOM INPUT</label>
<input type="text" class="form-control" [(ngModel)]="value" required>
<p *ngIf="control.errors.required && control.touched">Field is required</p>
<strong>Has input been touched: {{control.touched ? 'Yes' : 'No'}}</strong><br>
<strong>Is input untouched: {{control.untouched ? 'Yes' : 'No'}}</strong><br>
<strong>Is input dirty: {{control.dirty ? 'Yes' : 'No'}}</strong> <br>
<strong>Is input pristine: {{control.pristine ? 'Yes' : 'No'}}</strong>
</div>
<div>
In Custom Component: {{value}}
</div>
`
})


export class CustomInputComponent implements ControlValueAccessor {
@Input() control;


// The internal data model
private _value: any = '';

//Placeholders for the callbacks
private _onTouchedCallback: (_:any) => void = noop;

private _onChangeCallback: (_:any) => void = noop;

//get accessor
get value(): any { return this._value; };

//set accessor including call the onchange callback
set value(v: any) {
if (v !== this._value) {
this._value = v;
this._onChangeCallback(v);
}
}

//Set touched on blur
onTouched(){
this._onTouchedCallback(null);
}

//From ControlValueAccessor interface
writeValue(value: any) {
this._value = value;
}

//From ControlValueAccessor interface
registerOnChange(fn: any) {
this._onChangeCallback = fn;
}

//From ControlValueAccessor interface
registerOnTouched(fn: any) {
this._onTouchedCallback = fn;
}

}

感谢您的帮助!

最佳答案

刚刚踩到@sharpmachine 答案,它帮助解决了我的问题。我只想改进它:

不必在模板级别将 blur 事件绑定(bind)到 onTouched()(这可能容易出错),可以公开 ControlValueAccessor 作为 Directive 并在那里绑定(bind)事件。

import { Directive, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';

export const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CustomInputAccessor),
multi: true
};

@Directive({
selector: 'my-custom-input',
host: {'(blur)': 'onTouched($event)'},
providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR],
})
export class CustomInputAccessor implements ControlValueAccessor {

// The internal data model
private _value: any = '';

public onChange: any = (_) => { /*Empty*/ }
public onTouched: any = () => { /*Empty*/ }

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

set value(v: any) {
if (v !== this._value) {
this._value = v;
this.onChange(v);
}
}

writeValue(value: any) {
this._value = value;
}

registerOnChange(fn: any) {
this.onChange = fn;
}

registerOnTouched(fn: any) {
this.onTouched = fn;
}
}

这样您就可以使用该组件,而不必在每次使用时都绑定(bind) blur 事件。

希望对您有所帮助!

关于angular - 触摸/未触摸未在自定义输入组件中更新 - Angular 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com