ExtJS (4.2.2) 嵌套表单验证行为

ExtJS (4.2.2) nested form validation behavior

本文关键字:验证 表单 ExtJS 嵌套      更新时间:2023-09-26
当一个 Ext.form.Panel

包含另一个 Ext.form.Panel 时,内部面板验证会冒泡到外部面板。

我有一个具有许多关系的嵌套模型。内部窗体面板用于将子模型的记录添加到父记录。内部窗体面板具有自己的验证逻辑和保存按钮,可将内容添加到父级。

但是外部表单面板现在被内部表单面板无效,这不是我想要的。当我想保存整个记录(包括 hasMany 关系(时,内部表单面板可能(并且应该(非常空(并且无效(。

如何防止内部表单面板的验证传播到外部表单面板?

考虑到 ExtJs 对嵌套模型的支持,这似乎是一件合乎逻辑的事情,但似乎在任何地方都不支持。添加孩子时我也不想弹出一些窗口。它应该与父表单很好地集成

感谢您的任何帮助。

溶液

使用 field.up('form') 可能会在一定程度上影响性能,因此请注意。

Ext.define('Custom.form.Basic', {
    extend: 'Ext.form.Basic',
    onFieldAdd: function (field) {
        if (field.up('form') == this.owner)
            this.callParent(arguments);
    },
    onFieldRemove: function (field) {
        if (field.up('form') == this.owner)
            this.callParent(arguments);
    },
    getFields: function () {
        var owner = this.owner;
        return this.monitor.getItems().filterBy(function (f) {
            return f.up('form') == owner;
        });
    }
});
Ext.define('Custom.form.Panel', {
    extend: 'Ext.form.Panel',
    requires: [
        'Custom.form.Basic'
    ],
    createForm: function () {
        var cfg = {},
            props = this.basicFormConfigs,
            len = props.length,
            i = 0,
            prop;
        for (; i < len; ++i) {
            prop = props[i];
            cfg[prop] = this[prop];
        }
        return new Custom.form.Basic(this, cfg);
    }
});

这个问题与Ext.form.Panel无关,而与Ext.form.Basic有关。每个FormPanel都包含Ext.form.Basic,并且该基本形式负责验证。为了避免这种情况,您可以扩展基本窗体并修改onFieldAddonFieldRemove方法行为。根据设计,它将处理程序添加到任何级别的面板的所有子字段。然后,您应该扩展Ext.form.Panel createForm方法,以便它返回扩展的基本窗体。