2017-09-14 15 views
0

Ich habe ein Problem mit Formbuilder in Winkel 2. Ich habe das folgende Szenario.Wert eines Objektarrays mit Formbuilder ändern

Ich validiere eine E-Mail, wenn ich bereits innerhalb des Arrays von Mitarbeitern habe ich das Feld reinigen, wenn es nichts tun darf. Ich bin mit einer foreach dies zu überprüfen, in meinem Konstruktor ich die formbuild und die referent Teil sieht wie folgt aus:

enter image description here

Das Objekt, das ich auf Nachfrage add somit einer ist.

enter image description here

Ich habe eine Unschärfe Ereignis in der Eingangs- und diese Funktion ausführen.

public verifyEmail(employee_email: string, index) { 
    if (employee_email === '') { 
    return; 
    } 

    let ocorrency = 0; 
    this.formOrganization.value.employees.forEach(employee => { 
    if (employee.email === employee_email) { 
     ocorrency += 1 
    } 
    }); 

    if (ocorrency >= 2) { 
    this.messageNotify(false, 'email_already_exists'); 
    this.formOrganization.get('employees')[index].patchValue({'email': ''}); 
    } 
} 

Für die Funktion 2 Parameter zu senden, die erste ist, die E-Mail, die ich brauche zu testen, und die zweite der Index, die ich bin auf innerhalb des Arrays Objekt, auf das Bezug nimmt, ist es in diesem Index, I muss das Feld auf Null setzen.

Wie geht das?

Mein html ist:

 <div class="col-md-12 col-12 tabs-content" *ngIf="membersTabs"> 
     <div class="row" formArrayName="employees"> 
     <div class="col-12"> 
      <button class="btn btn-new pull-left" (click)="addEmployeer()">Adicionar Membros</button> 
     </div> 
     <div class="col-12"> 
      <div class="card card-members" 
       *ngFor="let employeer of formOrganization.controls.employees.controls; let index = index" 
       [formGroupName]="index"> 
      <div class="card-header"> 
       <div class="col-sm-12 col-md-8"> 
       <strong class="text-capitalize">{{formOrganization.value.employees[index].first_name}} 
        {{formOrganization.value.employees[index].second_name}}</strong> 
       </div> 
       <div class="wrapper-switch col-sm-12 col-md-4"> 
       <div class="row"> 
        <div class="col-sm-12 col-md-6"> 
        <button class="btn btn-new btn-transparent" *ngIf="formOrganization.value.employees[index]._id" 
          (click)="[changePasswordSelected(employeer.value), passwordModal.show()]">ALTERAR SENHA 
        </button> 
        </div> 
        <div class="col-sm-12 col-md-6"> 
        <button class="btn btn-cancel" (click)="removeEmployeer(index)">Remover</button> 
        </div> 
       </div> 
       </div> 
      </div> 
      <div class="card-block"> 
       <div class="row"> 
       <div class="col-lg-4 col-md-6 col-sm-12 form-group"> 
        <label class="col-md-10 form-control-label">Primeiro Nome</label> 
        <div class="col-md-12"> 
        <input class="form-control " name="first_name" type="text" 
          formControlName="first_name"> 
        </div> 
       </div> 
       <div class="col-lg-4 col-md-6 col-sm-12 form-group"> 
        <label class="col-md-10 form-control-label">Sobrenome</label> 
        <div class="col-md-12"> 
        <input class="form-control " name="second_name" type="text" 
          formControlName="second_name"> 
        </div> 
       </div> 
       <div class="col-lg-4 col-md-6 col-sm-12 form-group"> 
        <label class="col-md-10 form-control-label">Cargo</label> 
        <div class="col-md-12"> 
        <input class="form-control " name="office" type="text" formControlName="office"> 
        </div> 
       </div> 
       <div class="col-lg-2 col-md-6 col-sm-12 form-group"> 
        <label class="col-md-10 form-control-label">Acesso</label> 
        <div class="col-md-12"> 
        <select class="form-control modal-input" id="access" name="access" formControlName="access"> 
         <option value="">Selecione a opção</option> 
         <option *ngFor="let item of accesss" 
           [selected]="item.name == employeer.value.access.name" 
           [ngValue]="item">{{item.name}} 
         </option> 
        </select> 
        </div> 
       </div> 
       <div class="col-lg-2 col-md-1 col-sm-12 form-group"> 
        <label class="col-md-10 form-control-label">Status</label> 
        <div class="col-md-12"> 
        <label class="switch switch-text switch-pill switch-primary"> 
         <input type="checkbox" class="switch-input " formControlName="status"> 
         <span class="switch-label" data-on="On" data-off="Off"></span> 
         <span class="switch-handle"></span> 
        </label> 
        </div> 
       </div> 
       <div class="col-lg-4 col-md-6 col-sm-12 form-group"> 
        <label class="col-md-10 form-control-label">Email</label> 
        <div class="col-md-12"> 
        <input class="form-control " name="email" type="text" formControlName="email" 
          (blur)="verifyEmail(formOrganization.value.employees[index].email, index)"> 
        </div> 
       </div> 
       <div class="col-lg-4 col-md-5 col-sm-12 form-group" 
        *ngIf="!formOrganization.value.employees[index]._id"> 
        <label class="col-md-10 form-control-label">Senha</label> 
        <div class="col-md-12"> 
        <input class="form-control " name="password" type="password" 
          formControlName="password"> 
        </div> 
       </div> 
       </div> 
      </div> 
      </div> 
     </div> 
     </div> 
    </div> 

Meine Form von Formbuilder:

enter image description here

+0

Es ist nicht ganz klar, was Sie erreichen wollen und/oder wo die Problem ist. Können Sie den Index nicht als zweiten Parameter abrufen? –

+0

Vereinbart mit @ P.Moloney - wenn Sie '(blur) =" verifyEmail() "' von Ihrer Komponentenvorlage aufrufen, sollten Sie wahrscheinlich den Index von Ihrem HTML übergeben können, nachdem Sie ihn mit 'let deklariert haben i = index 'in Ihrer' * ngFor'-Anweisung. Aber wir müssen Ihre Vorlage HTML sehen, wenn das das Problem ist. –

+0

Mein Problem passiert, weil ich mein Feld löschen möchte, muss ich einen Wert im Feld festlegen, mit dem Modell wäre einfach zu tun: myModel = "die Zeichenfolge, die ich will", aber ich benutze formBuilder und außerdem kann ich haben 0, 1 oder infinitor Mitarbeiter. –

Antwort

2

wenn Sie möchten, die Sie löschen Feld Sie patchValue verwenden können ein Element des Formulars und das wird sich ändern ändern Sie auch Ihr Eingabefeld

this.formOrganization.patchValue({ 
    email: '' 
}); 

Update

Wenn die E-Mail unter der Mitarbeiteradresse steht, können Sie patchValue weiterhin für verschachtelte Arrays verwenden. Sie können

<label class="center-block">email: 
      <input class="form-control" #email formControlName="email" (blur)="test(email.value,i)"> 
      </label> 


test(value, index){ 
let x = <FormArray>this.heroForm.get('employees'); 
let y = (<FormControl>x.controls[index]) 

y.patchValue({ 
    email: '' 
}) 

} 

den Wert und der Index in Ihrem Unschärfe Ereignis übergeben Sie Index von * ngFor auf Mitarbeiter bekommen, lassen i = Index

+0

Es funktioniert nicht für mich –

+0

Ich aktualisierte meine Frage mit allen meinen formBuilder –

+0

versuchen Sie aktualisierte Antwort, ich versuchte in Plunker und es funktioniert! – JayDeeEss

Verwandte Themen