ExtJS实时计算一个字段

Calculate a field in real time ExtJS

我的 ExtJS 表单中有一个完成日期字段和一个到期日期字段。当用户选择完成日期时,我希望在选择完成日期后自动填充到期日期。

这是我目前的情况:

        var completionDate = {
                fieldLabel: 'Completion Date',
                xtype: 'datefield',
                submitFormat: 'time',
                name: 'trainingCompletion',
                labelAlign: 'right',
                labelWidth: 150,
                readOnly: false,
                readOnlyCls: 'readOnlyFields',
                listeners: {
                    select: function (dateField, newValue, oldValue){ 
                        expirationDate.oldValue = newValue;
                    }
                },

        };
        var expirationDate = {
                fieldLabel: 'Expiration Date',
                xtype: 'datefield',
                submitFormat: 'time',
                name: 'trainingExpiration',
                labelAlign: 'right',
                labelWidth: 150,
                readOnly: true,
                readOnlyCls: 'iamis_readOnlyFields'
        };

然后该函数应该向 completionDate 添加 15 个月,但我想先更新它

用于声明 trainingCompletiontrainingExpiration

的代码
{name: 'trainingCompletion', type: 'date', dateReadFormat: 'time', dateWriteFormat: 'm/d/Y', useNull: true},
{name: 'trainingExpiration', type: 'date', dateReadFormat: 'time', dateWriteFormat: 'm/d/Y', useNull: true},

这看起来不对:

expirationDate.oldValue = newValue

相反,您应该在日期字段上使用正确的 setValue() 方法

expirationDate.setValue(newValue);

提供的代码看起来很不完整。

在声明监听器时,您应该注意监听器将被执行的范围。假设这 2 个日期字段在一个表单上,您应该定义侦听器的范围以保证您将正确引用过期字段。

我在我的代码中做了一些与您类似的事情,所以我将分享一个以我的编程风格执行此操作的代码,但您可以根据自己的编码风格对其进行调整。

Ext.define("My.form.Task", {
    extend: "Ext.form.Panel",
    alias: "widget.mytaskform",
    buttonAlign: "left",
    defaults: {
        anchor: '100%',
        margin: '10px 0px 0px 0px',
        labelAlign: 'left',
        labelWidth: 125
    },
    initComponent: function() {
        this.items = [{
                fieldLabel: 'Completion Date',
                xtype: 'datefield',
                submitFormat: 'time',
                name: 'trainingCompletion',
                labelAlign: 'right',
                labelWidth: 150,
                readOnly: false,
                readOnlyCls: 'readOnlyFields',
                listeners: {
                    select: {
                        scope: this,
                        fn: function (dateField, newValue, oldValue){
                            var expirationField = this.down("[name=trainingExpiration]");
                            // You need to add the desired months to the date
                            // before setting it to the expirationField.
                            expirationField.setValue(newValue);
                        }
                    }
                },

        },{
                fieldLabel: 'Expiration Date',
                xtype: 'datefield',
                submitFormat: 'time',
                name: 'trainingExpiration',
                labelAlign: 'right',
                labelWidth: 150,
                readOnly: true,
                readOnlyCls: 'iamis_readOnlyFields'
        }];
        this.callParent(arguments);
    },
    // form remaining code...
});