【问题标题】:ExtJS: Synchronizing ComboBox and TagFieldExtJS:同步 ComboBox 和 TagField
【发布时间】:2018-10-29 05:14:12
【问题描述】:

客户要求申请人能够从选项列表中进行主要选择,然后也可以从相同选项中进行多项选择。 primary 和 secondary 的值不能重叠。

例如两道选色题:

Favorite Color: SELECT  Other Colors: SELECT

用户选择最喜欢的颜色红色:

Favorite Color: RED     Other Colors: SELECT
                ORANGE
                YELLOW
                GREEN
                BLUE
                PURPLE

红色现在从其他颜色中消失了:

Favorite Color: RED     Other Colors: ORANGE
                                      YELLOW
                                      GREEN
                                      BLUE
                                      PURPLE

用户选择其他颜色绿色和蓝色:

Favorite Color: RED     Other Colors: GREEN BLUE

绿色和蓝色已从最喜欢的颜色中消失:

Favorite Color: RED     Other Colors: GREEN BLUE
                ORANGE
                YELLOW
                PURPLE

用户选择不同的最喜欢的颜色紫色:

Favorite Color: PURPLE  Other Colors: GREEN BLUE

其他颜色现在有红色,但没有紫色:

Favorite Color: PURPLE  Other Colors: GREEN BLUE
                                      RED
                                      ORANGE
                                      YELLOW

我正在考虑将组合框与标签字段配对,但正如您所见,要让商店两边对齐很麻烦。我尝试使用过滤器,但它们似乎不能动态工作。

在 ExtJS 中有更简单的方法吗?就像一个标签域有一个商店但有两个输入框,一个限制一个选择,另一个允许多个?

【问题讨论】:

    标签: javascript extjs


    【解决方案1】:

    您可以使用过滤器动态过滤商店。

    对于第一个组合框,您需要创建一个过滤器来过滤掉单个选择。

    select: function(comb, record) {
        const value = record.get('abbr');
        const otherColors = Ext.getCmp('OtherColors');
        const otherColorsStore = otherColors.getStore();
        otherColorsStore.setFilters([{
            property: 'abbr',
            operator: '!=',
            value   : value
        }]);
    },
    

    对于配置了多选的第二个组合框,您需要创建一个应该为第一个组合框过滤掉的值的数组,然后使用notin operator

    select: function(me,records) {
        const favouriteColor = Ext.getCmp('FavouriteColor');
        const favouriteColorStore = favouriteColor.getStore();
        const values = records.map(r => r.get('abbr'));  // creates an array of all colors to filter out
        favouriteColorStore.setFilters([{
            property: 'abbr',
            operator: 'notin',
            value   : values
        }]);
     }
    

    See the working fiddle.

    【讨论】:

    • 谢谢。重要的技巧是复制商店,以便您可以应用独立的过滤器。我使用的是同一家商店并遇到了各种问题。
    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2019-12-02
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多