RadioGroup не обновляет связанное значение

Я использую radiogroup в своей форме и заметил, что когда я выбираю один из переключателей, значение (связанное значение) не обновляется.

Вот небольшой пример:

Ext.create({
    xtype: 'container',
    renderTo: Ext.getBody(),
    items: [{
        xtype: 'formpanel',
        viewModel: {
            data: {
                myValue: 3
            }
        },
        items: [{
            xtype: 'displayfield',
            label: 'This is the value of myValue:',
            bind: '{myValue}'
        }, {
            xtype: 'textfield',
            label: 'Update myValue:',
            bind: '{myValue}'
        }, {
            xtype: 'radiogroup',
            vertical: true,
            label: 'Click a radio button:',
            bind: '{myValue}',
            items: [{
                label: 'One',
                value: 1
            }, {
                label: 'Two',
                value: 2
            }, {
                label: 'Three',
                value: 3
            }, ]
        }]
    }]
});

Я создал простой viewModel с одним значением данных: myValue: 3. Это связано со всеми элементами формы: radiogroup, textfield и displayfield.

Я ожидал, что когда я нажму одну из переключателей, displayfield обновит свое значение. Значение displayfield обновляется, когда вы вводите textfield, но radiogroup не обновляется.

Кажется, что radiogroup использует только свое связанное значение при инициализации, но не замечает, когда он обновляется, и не обновляет его самостоятельно.

Что я делаю неправильно? Почему связанное значение не обновляется, когда я нажимаю переключатель?

Вот пример на Sencha Fiddle: https://fiddle.sencha.com/#view/editor&fiddle/389i


ОБНОВЛЕНИЕ: я нашел решение, добавляющее change слушателя к radiogroup. Что ж, это исправляет обновление myValue, когда вы нажимаете переключатель. Мне нужен другой слушатель для обновления radiogroup, когда myValue обновляется где-то в другом месте (например, в textfield).

Это работает для моих нужд, но зачем мне добавлять слушателя change? Почему radiogroup не привязывается к {myValue} правильно?

listeners: {
    change: function(field, val) {
        let vm = field.lookupViewModel();
        vm.set('myValue', val);
    }
}

Вот скрипка с примененным этим обновлением: https://fiddle.sencha.com/#view/editor&fiddle/389k


person Rocket Hazmat    schedule 18.08.2020    source источник


Ответы (3)


Я столкнулся с этой проблемой в начале этого года, но не думаю, что когда-либо сообщал о ней Sencha, потому что я использовал Community Edition. В любом случае, насколько я помню, я отследил это до некоторой проблемы в методе getValue, хотите верьте, хотите нет, и заменил это следующим (Скрипка здесь):

Ext.define('MyOverride', {
    override: 'Ext.field.RadioGroup',

    getValue: function () {
        var value = this.callParent(arguments);
        var bind = this.getBind()
        var bindValue = bind && bind.value;
        if (bindValue) {
            if (Ext.isEmpty(value) && !Ext.isEmpty(bindValue.getValue())) {
                value = bindValue.getValue()
            }
            bindValue.setValue(value)
        }
        return value
    }
});

Я уверен, что это неправильный способ переопределения, но на данный момент он меня разблокировал. Не уверен, что это полезно для вас, но я хотел поделиться.

person incutonez    schedule 19.08.2020
comment
Думаю, ваше решение лучше. :) Основная цель переопределения extjs - исправить ошибки. - person Arthur Rubens; 19.08.2020
comment
Теперь вопрос в том, сообщили ли вы об этом как об ошибке? - person incutonez; 19.08.2020
comment
Сообщили?) У Idera ужасная поддержка пользователей. Они убили фреймворк в основном из-за этого. - person Arthur Rubens; 19.08.2020
comment
Думаю, мнения расходятся. Я добился небольшого успеха с Sencha Support, и определенно большего успеха, чем когда они не принадлежали Idera. Я, наверное, когда-нибудь его создам. - person incutonez; 19.08.2020
comment
Компания, в которой я работаю, имеет премиальную поддержку Sencha. Так что, если я сообщу об этом, возможно, его можно будет переслать кому-нибудь, кто сможет помочь. - person Rocket Hazmat; 19.08.2020
comment
@RocketHazmat, было бы здорово, если бы вы создали заявку в службу поддержки Sencha и сослались на свой вопрос здесь, в StackOverflow, чтобы у них была история того, что происходит. Его заберет следующий доступный инженер службы поддержки, так что он сможет помочь. - person incutonez; 19.08.2020
comment
@incutonez Я так и сделал, и они дали мне неофициальное исправление :) Я опубликовал это как ответ. - person Rocket Hazmat; 19.08.2020

Я обратился в службу поддержки Sencha (от имени компании, в которой я работаю; у нас есть премиальная поддержка). Они сказали, что для этого уже есть открытый отчет об ошибке (EXTJS-28689), и предоставили неофициальное переопределение, которое устраняет проблему.

Ext.define(null, {
    override: 'Ext.field.FieldGroupContainer',

    onGroupChange: function () {
        var me = this,
            newVal, oldVal, isValid;

        if (me.isConfiguring || me.isDestructing() || me.suspendCheckChange) {
            return;
        }

        newVal = me.getValue();
        oldVal = me.lastValue || me.originalValue;

        if (!me.isEqual(newVal, oldVal)) {
            me.lastValue = newVal;
            me.fireEvent('change', me, newVal, oldVal);
            isValid = me.validate();

            if (isValid) {
                me.publishState('value', newVal);
            }
        }
    }
});

Сценарий с примененным переопределением: https://fiddle.sencha.com/#fiddle/38as

person Rocket Hazmat    schedule 19.08.2020
comment
Фантастика! Спасибо, что связались с ними и разместили здесь их ответ. - person incutonez; 19.08.2020
comment
Спасибо, что поделились :) - person Arthur Rubens; 20.08.2020
comment
Подобные вещи действительно заставляют меня желать, чтобы трекер ошибок был общедоступным или, по крайней мере, доступным для премиум-пользователей. - person Karl Carpenter; 26.08.2020

Проблема в наборе, текстовое поле возвращает строку и радиогруппу, работающую с числами .. наоборот, вам придется использовать грязный хак ..: - /

Ext.create({
    xtype: 'container',
    renderTo: Ext.getBody(),
    items: [{
        xtype: 'formpanel',
        viewModel: {
            data: {
                myValue: "3" // type string
            }
        },
        items: [{
            xtype: 'displayfield',
            label: 'This is the value of myValue:',
            bind: '{myValue}'
        }, {
            xtype: 'textfield',
            label: 'Update myValue:',
            bind: '{myValue}'
        }, {
            xtype: 'radiogroup',
            vertical: true,
            label: 'Click a radio button:',
            bind: '{myValue}',
            simpleValue: true,
            items: [{
                label: 'One',
                value: "1" // type string
            }, {
                label: 'Two',
                value: "2" // type string
            }, {
                label: 'Three',
                value: "3" // type string
            }],
            listeners: {
                change: function(radioGroup, newValue, oldValue) {
                    this.up('formpanel').getViewModel().set('myValue', newValue); // Dirty hack
                } 
            }
        }]
    }]
});
person Arthur Rubens    schedule 18.08.2020
comment
Спасибо за совет по поводу String v Number. В моем реальном проекте это не проблема (все они - строки), это была просто проблема в моем примере, поэтому спасибо за эту работу :-) - person Rocket Hazmat; 19.08.2020
comment
Что касается грязного взлома, то я решил использовать его в своем проекте для решения этой проблемы. В том, что я должен это делать, просто не имеет смысла. Может ли это быть ошибкой в ​​ExtJS? - person Rocket Hazmat; 19.08.2020