Angular Kendo 网格反应式网格编辑添加行状态更改订阅在模糊时未触发

Angular Kendo grid reactive grid editing add row statusChange subscription not triggered on blur

提问人:john nowlin 提问时间:10/25/2023 更新时间:10/25/2023 访问量:16

问:

使用状态更改订阅使用验证消息更新通知控件。除了新添加的行外,所有工作正常。按 Tab 键退出空必填字段会正确触发验证,将 ng-invalid 添加到输入文本框中,但不会触发 statusChange 订阅。

在显示输入框之前,formGroup.status 显示为设置为“INVALID”。我猜 statusChange 错过了无效的字段,因为它已经被标记为无效(叹气)。正确添加和删除字符会触发订阅。

我使用了这个 Kendo 示例 (https://www.telerik.com/kendo-angular-ui/components/grid/editing/editing-directives/#toc-reactive-editing-directive),并在堆栈闪电战 (https://angular-5eh2t5.stackblitz.io) 中添加了 statusChange 订阅。

我尝试了 updateValueAndValidity() 中的建议(反应式表单说当新的 FormGroup 在有效时添加到 FormArray 时无效)但没有成功。

我知道这是一个狭隘的情况,但有没有人遇到过这种情况并找到了解决方法,以便在添加 ng-invalid 时在新项目上触发订阅?

import { Component } from '@angular/core';
import { FormGroup, Validators, FormBuilder } from '@angular/forms';

import { products } from './products';
import { Product } from './model';
import { CreateFormGroupArgs } from '@progress/kendo-angular-grid';

@Component({
    selector: 'my-app',
    template: `
        <kendo-grid
            [kendoGridReactiveEditing]="createFormGroup"
            [kendoGridBinding]="products"
            [pageSize]="5"
            [pageable]="true"
            [sortable]="true"
            [navigable]="true"
        >
            <ng-template kendoGridToolbarTemplate>
                <button kendoGridAddCommand>Add new</button>
                formGroup status "{{ formGroup.status }}", {{ statusChanged }} statusChanged subscription events
            </ng-template>
            <kendo-grid-column field="ProductName" title="Product Name"></kendo-grid-column>
            <kendo-grid-column field="UnitPrice" editor="numeric" title="Price"></kendo-grid-column>
            <kendo-grid-column field="Discontinued" editor="boolean" title="Discontinued"></kendo-grid-column>
            <kendo-grid-column field="UnitsInStock" editor="numeric" title="Units In Stock"></kendo-grid-column>
            <kendo-grid-command-column title="command" [width]="220">
                <ng-template kendoGridCellTemplate let-isNew="isNew">
                    <button kendoGridEditCommand [primary]="true">Edit</button>
                    <button kendoGridRemoveCommand>Remove</button>
                    <button kendoGridSaveCommand [disabled]="formGroup.invalid">{{ isNew ? 'Add' : 'Update' }}</button>
                    <button kendoGridCancelCommand>{{ isNew ? 'Discard changes' : 'Cancel' }}</button>
                </ng-template>
            </kendo-grid-command-column>
        </kendo-grid>
    `,
})
export class AppComponent {
    public products: Product[] = products;
    public formGroup: FormGroup = this.formBuilder.group({
        ProductID: null,
        ProductName: '',
        UnitPrice: null,
        UnitsInStock: null,
        Discontinued: false,
    });

    public statusChanged: number = 0;

    constructor(private formBuilder: FormBuilder) {
        this.createFormGroup = this.createFormGroup.bind(this);
    }

    public createFormGroup(args: CreateFormGroupArgs): FormGroup {
        const item = args.isNew ? new Product() : args.dataItem;

        this.statusChanged = 0;

        this.formGroup = this.formBuilder.group({
            ProductID: item.ProductID,
            ProductName: [item.ProductName, Validators.required],
            UnitPrice: item.UnitPrice,
            UnitsInStock: [
                item.UnitsInStock,
                Validators.compose([Validators.required, Validators.pattern('^[0-9]{1,3}')]),
            ],
            Discontinued: item.Discontinued,
        });

        this.formGroup.updateValueAndValidity();

        this.formGroup.statusChanges.subscribe(status => {
            this.statusChanged++;
        })

        return this.formGroup;
    }
}
Angular 验证 Kendo-UI kendo-grid 订阅

评论


答: 暂无答案