首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文本框输入不能以反应性形式工作

文本框输入不能以反应性形式工作
EN

Stack Overflow用户
提问于 2022-07-05 15:12:08
回答 2查看 235关注 0票数 0

我使用的是角反应形式,并有以下控件:

代码语言:javascript
复制
 this.taskForm = this.formBuilder.group({
      storyNumber: new FormControl('', [Validators.required, Validators.pattern('^[A-Z]{2,}[0-9]*-[0-9]{2,}$')]),
      category: new FormControl({value:'', disabled: true}, Validators.required),
      taskName: new FormControl({value:'', disabled: true}, Validators.required),
      effortLevel: new FormControl({value:'', disabled: true}, Validators.required),
      complexityLevel: new FormControl({value:'', disabled: true}, Validators.required),
      note: new FormControl({value:'', disabled: true})
    })

其思想是,在开始时只启用故事号控件;但是,一旦用户输入有效的故事号,其他窗体控件就会启用。我的问题是,在启动应用程序时,所有的窗体控件都会被禁用,而不是在故事号输入中输入任何内容,即使它被标记为已启用。

控件的代码如下:

代码语言:javascript
复制
 <input id="storynumber"
             class="form-control"
             type="text"
             (keyup)="updateFormStoryNumber();"
             (ngModelChange)="updateFormStoryNumber()"
             formControlName="storyNumber">

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-05 17:01:52

代码语言:javascript
复制
taskForm = this.formBuilder.group({
      storyNumber: ['', [Validators.required, Validators.pattern('^[A-Z]{2,}[0-9]*-[0-9]{2,}$')]],
      category: [{value:'', disabled: true}, Validators.required],
      taskName: [{value:'', disabled: true}, Validators.required],
      effortLevel: [{value:'', disabled: true}, Validators.required],
      complexityLevel: [{value:'', disabled: true}, Validators.required],
      note: [{value:'', disabled: true}]
 })

constructor(){
      this.taskForm.get('storyNumber')?.valueChanges.subscribe((data)=>{
      // Your logic here
      this.enableField('category') 
      // Enable or
      this.disableField('category')
 })

  enableField(fieldName:string){
    this.taskForm.get(fieldName)?.enable()
  }

  disableField(fieldName:string){
    this.taskForm.get(fieldName)?.disable()
  }
票数 0
EN

Stack Overflow用户

发布于 2022-07-05 16:51:16

当我们使用formControlName或formControl进行输入时,我们应该使用而不是 use (ngModelChange)或(keyup),如果您想在更改时执行某些操作,则可以使用(输入)或(更改)。

关于禁用FormControl,众所周知,可以使用指令启用/禁用FormControl,参见,例如this SO (*)

现在您可以简单地使用

代码语言:javascript
复制
<form [formGroup]="taskForm">

    <!--your input storyNumber-->
    <input id="storynumber"
             class="form-control"
             formControlName="storyNumber">

    <!--all the rest of your input using the directive-->
    <input id="category"
             class="form-control"
             [disableControl]="taskForm.get('storyNumber').errors"
             formControlName="category">
    <input id="taskName"
             class="form-control"
             [disableControl]="taskForm.get('storyNumber').errors"
             formControlName="taskName">
    ...
</form>

注意不要在.ts中添加“额外代码”

(*)另一种方法是使用attrb.disabled=“条件”,但在本例中,您不是禁用FormControl,而是禁用FormControl输入

注意:在指令中,按条件更改“条件:布尔”:布尔值为null(不要忘记在模块导入中包含指令)

代码语言:javascript
复制
import { NgControl } from '@angular/forms';
@Directive({
  selector: '[disableControl]'
})
export class DisableControlDirective {
  @Input() set disableControl( condition : boolean| null ) {
    if (condition)
        this.ngControl.disable();
    else
        this.ngControl.enable();
  }

  constructor( private ngControl : NgControl ) {
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72871752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档