Требуется проверка поля для кендо-выпадающего списка в приложении Angular 7 - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь реализовать обязательную проверку поля для kendo-dropdownlist в моей управляемой шаблоном форме в angular 7. Если вы видите, я зацикливаюсь и генерирую динамическую таблицу, в которой есть выпадающий список kendo в каждой строке. Мне нужно выделить выпадающий список, если он не выбран. Я пытался заключить свои div в тег формы, думая, что смогу справиться с ним, когда пользователь нажимает submit, но я думаю, что это больше настройки в кендо. Может ли кто-нибудь сказать мне, как это сделать. Какие бы примеры я ни видел, пока все основано на jquery.

Вот стек https://stackblitz.com/edit/angular-4v2k8f

Html

form name="form" (ngSubmit)="f.form.valid && createDocument()" #f="ngForm" novalidate>
<div class="center" class="file-upload-wrapper">
    <ngx-file-drop dropZoneLabel="Drop files here" dropZoneClassName="file-drop" multiple="true"
        (onFileDrop)="dropped($event)" (onFileOver)="fileOver($event)" (onFileLeave)="fileLeave($event)">
        <ng-template ngx-file-drop-content-tmp let-openFileSelector="openFileSelector">
            <button type="button" (click)="openFileSelector()">Drop Files to Upload</button>
        </ng-template>
    </ngx-file-drop>

    <div class="upload-table">
        <table id="table1" class="center">

            <tbody class="upload-name-style">
                <tr *ngFor="let item of files; let i=index">
                    <td> <input kendoTextBox [(ngModel)]="item.relativePath" style="width: 350px" /></td>
                    <td>
                        <kendo-dropdownlist style="width:350px" [(ngModel)]="item.selectedDocumentItem" 
                            [data]="DocumentTypes" [defaultItem]="defaultItem" [filterable]="false" textField="Name"
                            valueField="Id">
                        </kendo-dropdownlist>
                    </td>
                    <td>
                        <kendo-datepicker style="width: 200px" [format]="'dd MMM, yyyy'"
                            [(ngModel)]="item.selectedDate"></kendo-datepicker>
                    </td>
                    <td> <button class="btn btn-default" (click)="deleteRow(i)"><i class="fa fa-trash"></i>Delete
                        </button></td>
                </tr>
            </tbody>
        </table>


    </div>
    <div class="wrapper">
        <button *ngIf="files.length > 0" type="submit" class="btn btn-primary btn-upload">upload</button>
    </div>
</div>


</form>

Компонент

 public createDocument() {
        this.files.forEach(element => {

            this.uploadDocument = <IDocument>{

                id: 5508,
                documentTypeId: element.selectedDocumentItem.Id ,
                name: element.relativePath,
                documentDate: element.selectedDate

              };


        });
        }

1 Ответ

1 голос
/ 07 июля 2019

Единственное, что вам нужно, это использовать ссылочную переменную и посмотреть, является ли она действительной или нет.Я поместил простой пример в stackblitz .Поскольку вы хотите знать только, есть ли у вас действительный, вы можете использовать простой обязательный.Мой стек-блиц выглядит как

Обновление : в форме отключена кнопка отправки

@Component({
  selector: 'my-app',
  template: `
    <div class="example-wrapper">
    <form #myForm="ngForm">
    <div *ngFor="let item of files; let i=index">
      <p>T-shirt size:</p>
      <kendo-dropdownlist name="select{{i}}" #name="ngModel" [(ngModel)]="value[i]" [data]="listItems" required>
      </kendo-dropdownlist>
      <span *ngIf="name.invalid">*</span>
    </div>
    <button [disabled]="myForm.invalid">submit</button>
    </form>
    </div>
  `
})
export class AppComponent {
    public listItems: Array<string> = ["X-Small", "Small", "Medium", "Large", "X-Large", "2X-Large"];
    value=[]
    files=[{value:''},{value:''},{value:''}]
}

Кратко объясните (но у вас есть документы )Когда у нас есть [(ngModel)], мы можем использовать ссылку на шаблон для ссылки на вход.Если мы сравним ссылку на шаблон с ngModel #name="ngModel", мы можем использовать в .html переменную шаблона и все свойства ngModel (недопустимый, тронутый ...) следующим образом: name.invalid, name.touched ...

Ах !, не волнуйтесь, вы поставили «одну и ту же» ссылочную переменную, если переменная модели не равна, Angular понимает, что это разные переменные.

ПРИМЕЧАНИЕ:Лично я предлагаю вам использовать ReactiveForms и FormArray, но это всего лишь мнение

Обновление 2 Действительно Проблема в том, что вы не можете перебирать тот же список, который хотите изменить.У вас есть *ngFor="let item of files", и вы меняете files.трюк заключается в итерации по ' '.repeat(files.length).split('') или созданию массива в коде this.iterator=new Array(this.files.length), тогда вы можете сделать <tr *ngFor="let t of iterator;let i=index">

[(ngModel)] над файлами [i] .selectedDocumentItem.Id

См. stackblitz и код

<div class="example-wrapper">
    <form #myForm="ngForm">
        <!-- other way is <tr *ngFor="let t of iterator;let i=index"> -->
        <tr *ngFor="let t of ' '.repeat(files.length).split(''); let i=index">
            <td>
                <kendo-dropdownlist name="select{{i}}" #name="ngModel" [(ngModel)]="files[i].selectedDocumentItem.Id" [defaultItem]="files[i].selectedDocumentItem.id"
                 [data]="DocumentTypes" [valuePrimitive]="true" textField="Name" valueField="Id" required>
                </kendo-dropdownlist>
                <span *ngIf="name.invalid">*</span>
      </td>
    </tr>
    <button [disabled]="myForm.invalid">submit</button>
  </form>
</div>

Если мы хотим использовать как [ngModel] = files [i] .selectedDocumentItem (объект), нам нужно создатьдиректива customError.Это выглядит как

@Directive({
  selector: '[requiredId]',
  providers: [{provide: NG_VALIDATORS, useExisting: RequiredIdDirective, multi: true}]
})
export class RequiredIdDirective implements Validator {

  validate(control: AbstractControl): {[key: string]: any} | null {
    return control.value.Id?null:{required:true}
  }
}

И наше выпадающее меню теперь выглядит как

<kendo-dropdownlist name="select{{i}}" #name="ngModel"
      [(ngModel)]="files[i].selectedDocumentItem" 
      [defaultItem]="files[i].selectedDocumentItem" 
      [data]="DocumentTypes" 
      textField="Name" valueField="Id" requiredId>
      </kendo-dropdownlist>

Смотрите новый stackblitz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...