如何在angular4中为来自ts的反应形式应用自定义指令?

Posted

技术标签:

【中文标题】如何在angular4中为来自ts的反应形式应用自定义指令?【英文标题】:How to apply custom directive for reactive forms from ts in angular4? 【发布时间】:2018-07-19 21:44:42 【问题描述】:

我正在按照指导原则使用直接表单从组件构建自定义 由 https://stackblitz.com/angular/ekboynmekgq?file=src%2Fapp%2Fdynamic-form-question.component.html

对于验证消息,我也在创建一个自定义组件, 请参考https://plnkr.co/edit/km7nGR8DjyE4l6tH5JEC?p=preview

在上面的第二个 plunker 链接中,给出了自定义指令方法,但问题是自定义指令直接应用于 html 表单元素而不是表单 ts

直接可以这样应用自定义属性指令就可以了

 <form>
<input type="text" customDirective>
</from>

现在我想使用自定义输入组件构建表单 结构看起来像

<form>
<custom-input></cutom-input>
<custom-dropdown></custom-dropdown>
</form>

我没有理解的一件事,如何应用来自 ts 的属性指令应该与自定义错误组件(第二个 plun 链接)很友好

哪位大神帮忙看看

【问题讨论】:

你应该创建一个自定义验证器 在上面的例子中,第二个 plunk 链接也提供了自定义验证器方法,请检查它,问题是它只能与直接 html 标签一起应用 【参考方案1】:

这个中等链接 - https://medium.com/@tarik.nzl/angular-2-custom-form-control-with-validation-json-input-2b4cf9bc2d73 tarik 可能会让您更好地了解如何操作。

验证器组件

import  Component, Input, forwardRef  from '@angular/core';
import  ControlValueAccessor, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormControl, Validator  from '@angular/forms';

@Component(
    selector: 'json-input',
    template:
        `
        <textarea
          [value]="jsonString" 
          (change)="onChange($event)" 
          (keyup)="onChange($event)">

        </textarea>
        `,
    providers: [
    
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => JsonInputComponent),
      multi: true,
    ,
    
      provide: NG_VALIDATORS,
      useExisting: forwardRef(() => JsonInputComponent),
      multi: true,
    ]        
)
export class JsonInputComponent implements ControlValueAccessor, Validator 
    private jsonString: string;
    private parseError: boolean;
    private data: any;

    // this is the initial value set to the component
    public writeValue(obj: any) 
        if (obj) 
            this.data = obj;
            // this will format it with 4 character spacing
            this.jsonString = JSON.stringify(this.data, undefined, 4); 
        
    

    // registers 'fn' that will be fired wheb changes are made
    // this is how we emit the changes back to the form
    public registerOnChange(fn: any) 
        this.propagateChange = fn;
    

    // validates the form, returns null when valid else the validation object
    // in this case we're checking if the json parsing has passed or failed from the onChange method
    public validate(c: FormControl) 
        return (!this.parseError) ? null : 
            jsonParseError: 
                valid: false,
            ,
        ;
    

    // not used, used for touch input
    public registerOnTouched()  

    // change events from the textarea
    private onChange(event) 

        // get value from text area
        let newValue = event.target.value;

        try 
            // parse it to json
            this.data = JSON.parse(newValue);
            this.parseError = false;
         catch (ex) 
            // set parse error if it fails
            this.parseError = true;
        

        // update the form
        this.propagateChange(this.data);
    

    // the method set in registerOnChange to emit changes back to the form
    private propagateChange = (_: any) =>  ;

【讨论】:

以上是关于如何在angular4中为来自ts的反应形式应用自定义指令?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4 - 验证器自定义函数这是未定义的

如何在本机反应中为整个应用程序(如每个屏幕)在屏幕底部显示自定义视图

Angular 4:如何将字符串数组分配给反应形式的复选框

填充/修补角度反应形式的值

在打字稿文件上启用 Eslint

如何在通知内容扩展中为我的自定义视图应用自定义字体/颜色和半透明背景?