Как убрать ребенка при удалении родителя? - PullRequest
0 голосов
/ 14 ноября 2018

Я делаю угловое приложение с угловой динамической формой, где я использую ng-select library .

HTML с выбором:

    <div *ngFor="let question of questions" class="form-row {{question.class}}">
            <ng-container *ngIf="question.children">
                <div [formArrayName]="question.key" class="w-100">
                    <div *ngFor="let item of form.get(question.key).controls; let i=index" [formGroupName]="i" class="row mt-1">
                        <div *ngFor="let item of question.children" class="{{item.class}} align-middle">
                            <div class="w-100">
                                <dynamic-form-builder [question]="item" [index]="i" [form]="form.get(question.key).at(i)"></dynamic-form-builder>
                            </div>
                        </div>
                    </div>
                    <div class="container">
                        <div class="row">
                            <div class="col-6 col-sm-12 col-lg-6 col-md-6">
                                <div class="form-label-group" *ngIf="showTemplateDropdown">
                                    <ngi-select placeholder="Select Template" [required]="true" [hideSelected]="false" [multiple]="true" [items]="templateList"
                                     dropdownPosition="down" bindLabel="name" bindValue="id" (add)="getTemplateValues($event)" (remove)="onRemove($event)">
                                    </ngi-select>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="container">
                        <div class="row">
                            <div class="col-6 col-sm-12 col-lg-6 col-md-6">

                            </div>
                            <div class="col-6 col-sm-12 col-lg-6 col-md-6 text-right">
                                <div class="btn-group  float-right">
                                    <button class="btn btn-primary btn-round btn-fab mat-raised-button" mat-min-fab="" mat-raised-button="" type="button"
                                     (click)="addControls('template_properties')">
                                        <span class="mat-button-wrapper"><i class="material-icons mt-2">add</i></span>
                                        <div class="mat-button-ripple mat-ripple" matripple=""></div>
                                        <div class="mat-button-focus-overlay"></div>
                                    </button> &nbsp;&nbsp;&nbsp;
                                    <button class="btn btn-primary btn-round btn-fab mat-raised-button" mat-min-fab="" mat-raised-button="" type="button"
                                     (click)="removeControls('template_properties')">
                                        <span class="mat-button-wrapper"><i class="material-icons mt-2">remove</i></span>
                                        <div class="mat-button-ripple mat-ripple" matripple=""></div>
                                        <div class="mat-button-focus-overlay"></div>
                                    </button>
                                </div>
                            </div>
                        </div>
                    </div>

                </div>
            </ng-container>
            <ng-container *ngIf="!question.children">
                <div class="w-100">
                    <dynamic-form-builder [question]="question" [form]="form"></dynamic-form-builder>
                </div>
            </ng-container>
        </div>

Здесь [items]="templateList" имеет следующее значение,

[{"id":"5bebba2c20ccc52871509d56","name":"Template One"},
{"id":"5bebba5720ccc52871509d57","name":"Template Two"},
{"id":"5bebba8d20ccc52871509d5d","name":"Template Three"}]

У меня есть событие (change)="getTemplateValues($event)" для обнаружения каждого изменения, когда мы выбираем элемент из выпадающего списка.

Функция изменения события Отредактировано ,

    getTemplateValues(e) {
      this.dynamicFormService.getRest("url" + '/' + e.id").subscribe(res => {
  try {
    if (res.status === "true") {
      res.data.template_properties.forEach(element => {
        this.templateArray.push(element);
      });
      this.form = this.qcs.toFormGroup(this.questions);
      for (let i = 0; i < this.templateArray.length; i++) {
        this.addControls('template_properties');
      }
      let propertiesArray = [];
      this.templateArray.forEach(element => {
        propertiesArray.push(element);
      });
      this.form.patchValue({
        'template_properties': propertiesArray
      });
    } else {

    }
  }
  catch (error) {

  }
})
* *} Тысяча двадцать-один

console.log(this.propertiesArray) дает следующее,

[{"property_name":"Property one","property_type":4,"property_required":true,"property_origin":1},{"property_name":"Property one","property_type":5,"property_required":true,"property_origin":1}]  

На изображении ниже я удалил шаблон три, но в нем все еще отображаются три свойства шаблона.

enter image description here

Здесь сначала я сначала фильтрую данные и игнорирую дубликаты, и каждый раз, когда я отправляю в сервис только новые выбранные значения, и извлекаю данные, связанные с идентификатором element.id.

И используя this.addControls('template_properties'), чтобы открыть количество строк, и элементы будут исправлены в форме template_properties.

this.form.patchValue({
 'template_properties': propertiesArray
});

На данный момент все работает нормально ..

Проблема на самом деле возникает здесь :

Если мы удаляем выбранный список из выпадающего списка (скажем, я выбрал все три шаблона и у меня есть удалено template two, то этот конкретный template template_properties должен быть удален. .

Я пытался с (remove)="onRemove($event)", но он не работает, потому что при удалении данных функция (change) также вызывает ..

Как я могу удалить template_properties с this.removeControls('template_properties'); определенного имени удаленного шаблона в событии изменения или удаления ..

Удалить функцию :

  onRemove(e) {
    console.log(e);
    this.dynamicFormService.getRest("url" + '/' + e.value.id").subscribe(res => {
      try {
        if (res.status === "true") {
          for (let i = 0; i < res.data.template_properties.length; i++) {
            this.removeControls('template_properties');
          }
        } else {

        }
      }
      catch (error) {

      }
    })
  }

Снять элемент управления :

  removeControls(control: string) {
    let array = this.form.get(control) as FormArray;
    console.log(array)
    array.removeAt(array.length);
  }

console.log(array) т,

enter image description here

1 Ответ

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

Это должно быть довольно легко исправить. Используйте (add) вместо (change) в ngi-select.

 onRemove(e) {
    console.log(e);
    this.dynamicFormService.getRest("url" + '/' + e.value.id").subscribe(res => {
      try {
        if (res.status === "true") {
          this.form = this.qcs.toFormGroup(this.questions);

          // Issue is here, you should remove only specific record
          // which is being passed from function `e`
          for (let i = 0; i < res.data.template_properties.length; i++) {
            this.removeControls('template_properties'); 
          }

          let propertiesArray = [];
          this.templateArray.forEach(element => {
            propertiesArray.push(element);
          });
          this.form.patchValue({
            'template_properties': propertiesArray
          });
        } else {

        }
      }
      catch (error) {

      }
    })
  }

Передайте индекс в removeControls, где вы хотите удалить элемент.

  removeControls(control: string, index:number) {
    let array = this.form.get(control) as FormArray;
    console.log(array)
    array.removeAt(index);
  }

console.log(array) дает, enter image description here

...