【问题标题】:ExtJS radio group - how to set value based on user confirmation?ExtJS 广播组 - 如何根据用户确认设置值?
【发布时间】:2017-07-17 15:40:33
【问题描述】:

我有一个单选组字段,其中包含两个单选按钮。默认情况下选中一个单选按钮。当我单击另一个时,更改事件会触发并呈现一条确认消息,说明是或否。如果单击“是”,则该值将更改。如果单击 NO,则值应保持不变。

例如默认选择第 2 项。如果我单击项目 1,然后单击否。应检查第 2 项,但不要检查第 1 项。

var RG = Ext.create({
        xtype: 'radiogroup',
        fieldLabel: 'Two Columns',
        // Arrange radio buttons into two columns, distributed vertically
        columns: 2,
        vertical: true,
        items: [
            { boxLabel: 'Item 1', name: 'rb', inputValue: '1' },
            { boxLabel: 'Item 2', name: 'rb', inputValue: '2', checked: true}
        ],
        listeners:{
            'change':function(cmp, newValue, oldValue){
                Ext.Msg.show({
                    title:'Save Changes?',
                    message: 'Would you like to save your changes?',
                    buttons: Ext.Msg.YESNO,
                    icon: Ext.Msg.QUESTION,
                    fn: function(btn) {
                        if (btn === 'yes') {
                            alert('Yes pressed');
                        } else if (btn === 'no') {
                            alert('No pressed');
                            //New Code
                        }
                    }
                });
            }
        }
    });

Ext.create('Ext.form.Panel', {
    title: 'RadioGroup Example',
    width: 300,
    height: 125,
    bodyPadding: 10,
    renderTo: Ext.getBody(),
    items:[RG]
});

请让我知道如何进行适当的更改以实现此行为。

提前致谢!

【问题讨论】:

    标签: extjs radio-button extjs5 radio-group


    【解决方案1】:

    先挂起更改事件,然后再设置旧值的组件恢复更改事件,找到下面的代码

          Ext.Msg.show({
                    title:'Save Changes?',
                    message: 'Would you like to save your changes?',
                    buttons: Ext.Msg.YESNO,
                    icon: Ext.Msg.QUESTION,
                    fn: function(btn) {
                        if (btn === 'yes') {
                            alert('Yes pressed');
                        } else if (btn === 'no') {
                            cmp.suspendEvent('change');
                            cmp.setValue(oldValue);
                            cmp.resumeEvent('change');
                        }
                    }
                });
    

    【讨论】:

    • cmp.reset();而不是 cmp.setValue(oldValue);也有效
    【解决方案2】:

    您正在寻找的场景可以通过控制器来实现。为您的更改侦听器指定一个函数名称,如下所示: 听众:{ 更改:'applicantRadioChange' }

    在控制器中写这个函数为:

    applicantRadioChange : function(cmp,newValue,oldValue){
    
    if(newValue != oldValue)
    {
    Ext.Msg.show({
                                title:'Save Changes?',
                                message: 'Would you like to save your changes?',
                                buttons: Ext.Msg.YESNO,
                                icon: Ext.Msg.QUESTION,
                                fn: function(btn) {
                                    if (btn === 'yes') {
                                        alert('Yes pressed');
                                    } else if (btn === 'no') {
                                        cmp.setValue(oldValue);
    
                                    }
                                }
                            });
    
    }
    

    【讨论】:

    • 如果您设置 oldvalue 而不暂停更改事件,则会出现问题,它会再次触发更改事件并可能变得递归。
    • 它不会在我的最后变得递归。实际上 Ext.Msg 仅在布局未暂停时才有效,因此不需要。无论如何,另一件事是,在主视图文件的 Ext.Msg.Show 中,您找不到 cmp、oldValue 和 newValue,因此您需要在控制器中使用它。
    • set.Cmp(oldValue) 是肯定会触发的更改。检查小提琴fiddle.sencha.com/#view/editor&fiddle/1r0t 并单击否它会再次触发。
    • 无论监听器在视图还是控制器中,我们都会在回调中获取所有参数
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多