ExtJS 7.2 - 将记录加载到具有链接组合框和 forceSelection:true 的表单中不会加载所有值

ExtJS 7.2 - Loading record into a form with chained comboboxes and forceSelection:true does not load all values

我有一个包含两个链接组合框的表单。第一个链接的组合框指示出现在第二个中的值。我在第二个组合框上有 forceSelection:true,这样当用户更改第一个组合框时,第二个组合框将被设置为空白,因为它不再是有效选项。链式组合按预期运行,但是当我使用 getForm().loadRecord(record) 将记录加载到此表单时,第一个组合的值设置正确但第二个不是,除非我设置 forceSelection:false.

下面的 fiddle 应该很清楚:sencha fiddle

单击“加载记录”应该会在 Fruits/Apple 中加载,但只显示 Fruits。第二次单击“加载记录”可获得所需的结果。如果您注释掉 forceSelection: true 它会按预期工作,但链接的组合不会按预期工作。有什么地方我做错了吗?

没那么容易。当你 运行 form.loadRecord(rec).

时发生了什么
  1. 您设置了 FoodGroup 组合框
  2. 您设置了 FoodName 组合框。但是该值不存在,因为您的过滤器没有切换到适当的食物组。这就是为什么评论力选择有帮助的原因。 (这就是评论过滤器也有帮助的原因)。
  3. 打开了食物名称的过滤器。商店现在有了新的价值。

您是第二次点击按钮。第一个组合框值相同,过滤器未触发(触发?),您在第二个商店中已经有适当的值并选择了该值。

如何解决: 修复是丑陋的。您可以在商店 'refresh' 上监听(这意味着过滤器被触发),然后设置第二个值(或再次设置值)。

Ext.define('Fiddle.view.FormModel', {
    extend: 'Ext.app.ViewModel',
    alias: 'viewmodel.fiddle-form-model',
    stores: {
        foodgroups: {
            fields: ['name'],
            data: [{
                foodgroupname: 'Fruits'
            }, {
                foodgroupname: 'Vegetables'
            }]
        },
        foods: {
            fields: ['foodgroupname', 'foodname'],
            filters: {
                property: 'foodgroupname',
                value: '{selectedFoodgroup.foodgroupname}'
            },
            data: [{
                foodname: 'Apple',
                foodgroupname: 'Fruits'
            }, {
                foodname: 'Banana',
                foodgroupname: 'Fruits'
            }, {
                foodname: 'Lettuce',
                foodgroupname: 'Vegetables'
            }, {
                foodname: 'Carrot',
                foodgroupname: 'Vegetables'
            }]
        }
    }
});

Ext.define('Fiddle.view.Form', {
    extend: 'Ext.form.Panel',
    xtype: 'fiddle-form',
    viewModel: {
        type: 'fiddle-form-model'
    },

    title: 'Combos',
    items: [{
        xtype: 'combo',
        itemId: 'FoodGroup', // To access FoodGroup
        displayField: 'foodgroupname',
        bind: {
            store: '{foodgroups}',
            selection: '{selectedFoodgroup}'
        },
        valueField: 'foodgroupname',
        forceSelection: true,
        name: 'foodgroup',
        fieldLabel: 'Food Group',
        value: 'Vegetables'
    }, {
        xtype: 'combo',
        itemId: 'FoodName', // To access FoodName
        bind: {
            store: '{foods}'
        },
        queryMode: 'local',
        forceSelection: true, //COMMENTING THIS OUT ACHIEVES DESIRED LOAD RECORD BEHAVIOR
        displayField: 'foodname',
        valueField: 'foodname',
        name: 'food',
        fieldLabel: 'Food',
        value: 'Carrot'
    }],

    buttons: [{
        text: 'Load Record',
        handler: function (btn) {
            // OUR UGLY FIX
            var form = btn.up('form'),
                foodGroupComboBox = form.down('combobox#FoodGroup'),
                foodNameComboBox = form.down('combobox#FoodName'),
                record = Ext.create('Ext.data.Model', {
                    foodgroup: 'Fruits',
                    food: 'Apple'
                });
            foodNameComboBox.getStore().on('refresh', function (store) {
                form.loadRecord(record);
            }, this, {
                single: true
            })

            form.loadRecord(record);
        }
    }]

});

Ext.application({
    name: 'Fiddle',

    launch: function () {

        var form = new Fiddle.view.Form({
            renderTo: document.body,
            width: 600,
            height: 400
        });

    }
});