【问题标题】:How to add additional keys to the itemselector keymap EXTjs?如何向 itemselector 键映射 EXTjs 添加其他键?
【发布时间】:2021-03-30 16:39:29
【问题描述】:

有没有办法扩展ItemSelector的KeyMap? 我想添加一个键盘映射(如 itemselector 中的 pageUp 和 pageDown keyEvent),当我按下字母“A-Z”时,我会转到以按下字母开头的项目并选择它。

【问题讨论】:

    标签: extjs extjs7


    【解决方案1】:

    您可以使用以下覆盖(小提琴示例)来实现它。在查看疼痛重新加载时,它将无法正常工作。您必须定义记录搜索记录字段。对于复杂的视图模板,您可以删除硬编码的搜索功能并将其用作设置。

    Ext.define('overrides.view.NavigationModel', {
        override: 'Ext.view.NavigationModel',
        searchRecordField: false,
        
        initKeyNav: function (view) {
            var me = this;
    
            // Drive the KeyNav off the View's itemkeydown event so that beforeitemkeydown listeners may veto.
            // By default KeyNav uses defaultEventAction: 'stopEvent', and this is required for movement keys
            // which by default affect scrolling.
            var keyNavConfig = {
                target: view,
                ignoreInputFields: true,
                eventName: 'itemkeydown',
                defaultEventAction: 'stopEvent',
                processEvent: me.processViewEvent,
                up: me.onKeyUp,
                down: me.onKeyDown,
                right: me.onKeyRight,
                left: me.onKeyLeft,
                pageDown: me.onKeyPageDown,
                pageUp: me.onKeyPageUp,
                home: me.onKeyHome,
                end: me.onKeyEnd,
                space: me.onKeySpace,
                enter: me.onKeyEnter,
                A: {
                    ctrl: true,
                    // Need a separate function because we don't want the key
                    // events passed on to selectAll (causes event suppression).
                    handler: me.onSelectAllKeyPress
                },
                F: me.onAlphabetKeyPress,
                scope: me
            };
    
            if(this.view.searchRecordField) {
                keyNavConfig = Ext.Object.merge(keyNavConfig, this.getAdditionalKeyNav());
            }
            me.keyNav = new Ext.util.KeyNav(keyNavConfig);
        },
        
        getAdditionalKeyNav: function() {
            var keyNav = {};
            this.view.getStore().each(function(record) {
                var firstLetter = record.get(this.view.searchRecordField)[0].toUpperCase();
                if(!keyNav[firstLetter]) {
                    keyNav[firstLetter] = this.onAlphabetKeyPress
                }
            }, this);
            return keyNav;
        },
        
        onAlphabetKeyPress: function(keyEvent) {
            const key = keyEvent.event.key;
            var foundRecordIndex = this.view.getStore().findBy(function(record) {
                return record.get('title').toLowerCase().indexOf(key) === 0;
            }, this);
            if(foundRecordIndex > -1) {
                this.setPosition(foundRecordIndex, keyEvent);
            }
        }
    });
    
    Ext.application({
        name: 'Fiddle',
    
        launch: function () {
            Ext.define('ListItem', {
                extend: 'Ext.data.Model',
                fields: [{
                    name: 'src',
                    type: 'string'
                }, {
                    name: 'caption',
                    type: 'string'
                }]
            });
    
            Ext.create('Ext.data.Store', {
                id: 'ListItemsStore',
                model: 'ListItem',
                data: [{
                    title: "One"
                }, {
                    title: "Two"
                }, {
                    title: "Three"
                }, {
                    title: "Four"
                }, {
                    title: "Three"
                }, ]
            });
    
            var imageTpl = new Ext.XTemplate(
                '<tpl for=".">',
                '<div style="margin-bottom: 10px;" class="thumb-wrap">',
                '<span>{title}</span>',
                '</div>',
                '</tpl>'
            );
    
            Ext.create('Ext.view.View', {
                store: Ext.data.StoreManager.lookup('ListItemsStore'),
                tpl: imageTpl,
                itemSelector: 'div.thumb-wrap',
                emptyText: 'No images available',
                // Search Record Field
                searchRecordField: 'title',
                renderTo: Ext.getBody()
            });
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多