Установить блокировку управления на formgroup в угловых 5 - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу отключить / включить переход на другую вкладку соответственно, если форма недействительна / действительна. Ниже приведен фрагмент моего кода

component.ts

    @Directive({
       selector: '[disableControl]'
    })

    export class ApplicationComponent implements OnInit, AfterViewInit, OnDestroy {
    [...]
    constructor(private _formBuilder: FormBuilder, public dialog: MatDialog, public _DomSanitizer: DomSanitizer,  public state: StatesService, public lga: LgasService, private http: HttpClient, private ngControl : NgControl) {

        [...]
        //setControl
        @MatTabLabel(parameters) set disableControl( condition : boolean ) {
           const action = condition ? 'disable' : 'enable';
           this.ngControl.control[action]();
        }
        [...]
        this.PDform = _formBuilder.group({
           surname: ['', Validators.required],
           firstName': ['', Validators.required],
           middleName: [''],
           gender: ['', Validators.required],
           maritalStatus: ['', Validators.required],
           highestQualification : ['', Validators.required],
           nationality: ['', Validators.required],
           [...]
        })
        this.NOKform = _formBuilder.group({
           nextOfKinTitle: ['', Validators.required],
           nextOfKinSurname: ['', Validators.required],
           nextOfKinFirstName: ['', Validators.required],
           nextOfKinMiddleName : [''],
           nextOfKinGender: ['', Validators.required],
           nextOfKinRelationship: ['', Validators.required],
           nextOfKinZipCode: ['', Validators.maxLength(6)],
           [...]
        })
      }
    }

app.module.ts

    NgModule({
       [...]
       imports: [
          FormsModule,
          ReactiveFormsModule
       ]
       [...]
    })

HTML:

    <mat-tab label="Personal Details" class=tabHeading">
       <form [formGroup]="PDform">
          [...]
          <mat-form-field appearance="outline">
             <mat-label><span class="required">*&nbsp;</span>Surname</mat-label>
                   <input  [(ngModel)]="surname" formControlName="surname" matInput>
          </mat-form-field>
          <mat-form-field appearance="outline">
             <mat-label><span class="required">*&nbsp;</span> FirstName</mat-label>
                   <input  [(ngModel)]="firstName" formControlName=" firstName" matInput>
          </mat-form-field>
          <mat-form-field appearance="outline">
             <mat-label>Middle name</mat-label>
             <input [(ngModel)]="middleName" formControlName="middleName" matInput>
          </mat-form-field>
          <mat-form-field>
             <mat-select [(ngModel)]="gender" formControlName="gender" placeholder="* Gender">
               <mat-option value="">Select</mat-option>
               <mat-option value="M">Male</mat-option>
               <mat-option value="F">Female</mat-option>
             </mat-select>
          </mat-form-field>
          <mat-form-field>
             <mat-select [(ngModel)]="maritalStatus" formControlName="maritalStatus" placeholder="* Marital Status">
                <mat-option value="">Select</mat-option>
                <mat-option value="S">Single</mat-option>
                <mat-option value="M">Married</mat-option>
                <mat-option value="D">Divorced</mat-option>
                <mat-option value="SP">Separated</mat-option>
                <mat-option value="W">Widowed</mat-option>
             </mat-select> 
             [...]
         </mat-form-field>
       </form>
    </mat-tab>
    <mat-tab label="Employment Record" class=tabHeading [disableControl]="PDform.valid ? enable : disable">
       <form [formGroup]="NOKform">
          [...]
          <mat-form-field>
             <mat-select [(ngModel)]="nextOfKinTitle" formControlName="nextOfKinTitle" placeholder="Title">
                <mat-option value="">Select</mat-option>
                <mat-option value="MR">Mr</mat-option>
                <mat-option value="MRS">Mrs</mat-option>
                <mat-option value="MISS">Miss</mat-option>
             </mat-select>
          </mat-form-field>
          <mat-form-field appearance="outline">
             <mat-label><span class="required">*&nbsp;</span>Surname</mat-label>
                   <input  [(ngModel)]="nextOfKinSurname" formControlName="nextOfKinSurname" matInput>
          </mat-form-field>
          <mat-form-field appearance="outline">
             <mat-label><span class="required">*&nbsp;</span> FirstName</mat-label>
                   <input  [(ngModel)]="nextOfKinFirstName" formControlName="nextOfKinFirstName" matInput>
          </mat-form-field>
          <mat-form-field appearance="outline">
             <mat-label>Middle name</mat-label>
             <input [(ngModel)]="nextOfKinMiddleName" formControlName="middleName" matInput>
          </mat-form-field>
          <mat-form-field>
             <mat-select [(ngModel)]="nextOfKinGender" formControlName="nextOfKinGender" placeholder="* Gender">
               <mat-option value="">Select</mat-option>
               <mat-option value="M">Male</mat-option>
               <mat-option value="F">Female</mat-option>
             </mat-select>
          </mat-form-field>
          <mat-form-field>
             <mat-select [(ngModel)]="nextOfKinMaritalStatus" formControlName="nextOfKinMaritalStatus" placeholder="* Marital Status">
                <mat-option value="">Select</mat-option>
                <mat-option value="S">Single</mat-option>
                <mat-option value="M">Married</mat-option>
                <mat-option value="D">Divorced</mat-option>
                <mat-option value="SP">Separated</mat-option>
                <mat-option value="W">Widowed</mat-option>
             </mat-select>
          </mat-form-field> 
          [...]
       </form>
    </mat-tab>

К сожалению, я получаю эту ошибку на init

    ERROR Error: Uncaught (in promise): Error: 
    StaticInjectorError(AppModule)[MatInput -> NgControl]: 
    StaticInjectorError(Platform: core)[MatInput -> NgControl]: 
    NullInjectorError: No provider for NgControl!
    Error: StaticInjectorError(AppModule)[MatInput -> NgControl]: 
    StaticInjectorError(Platform: core)[MatInput -> NgControl]: 
    NullInjectorError: No provider for NgControl!

После долгих исследований выясняется, что мне нужно установить disableControl на элемент matTabLabel, а не на @Input, как я сделал. matTabLabel принимает два параметра templateRef: TemplateRef<C> и viewContainerRef: ViewContainerRef. Теперь задача состоит в том, чтобы передать параметры метке при настройке элемента управления

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Если вы хотите отключить вкладку, используйте директиву ngStyle. Удалите директиву disablecontrol со своей вкладки

<mat-tab label="Personal Details" class=tabHeading">
   <form [formGroup]="PDform">
      [...]
   </form>
</mat-tab>
<mat-tab label="Employment Record" class=tabHeading [ngStyle]="{'pointer-events'   PDform.valid ? 'auto'  : 'none' }">
   <form [formGroup]="NOKform">
       [...]
   </form>
</mat-tab>
0 голосов
/ 02 ноября 2018
  1. formcontrols требует форму, является ли mat-tab в форме?
  2. Вы можете просто использовать [disable] = "! PDform.valid"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...