【问题标题】:Events order between DOM event and sencha eventDOM 事件和 sencha 事件之间的事件顺序
【发布时间】:2020-03-11 19:58:50
【问题描述】:

我有一个数据视图,用 extjs 7.1 现代 takeit 编写,带有一个带有 anchor 标签select 事件的模板:

https://fiddle.sencha.com/#view/editor&fiddle/34bd

Ext.create({
    renderTo: document.body,

    xtype: 'list',
    itemTpl: '<div class="contact"><a onclick="event.preventDefault();console.log(\'link\');" href="{firstName}">{firstName}</a> <b>{lastName}</b></div>',

    store: {

        data: [{
            firstName: 'Peter',
            lastName: 'Venkman'
        }, {
            firstName: 'Raymond',
            lastName: 'Stantz'
        }, {
            firstName: 'Egon',
            lastName: 'Spengler'
        }, {
            firstName: 'Winston',
            lastName: 'Zeddemore'
        }]
    },
    listeners: {
        select() { console.log('select'); }
    }
});

我希望链接事件会在列表选择事件之前触发,但相反的情况会发生,甚至最坏的情况是两个事件会一个接一个地触发。

【问题讨论】:

  • 在您的小提琴示例中,itemtap 自 6.5.0 版起已弃用,使用 childtap。关于您的期望,为什么您不能在 childtap 事件中编写链接逻辑?
  • 如果用户单击特定链接或整个列表项,我需要执行不同的操作。
  • 我正在尝试按照您的建议了解用户点击的位置,但我不知道如何。可以在 sencha fiddle 中查看代码:fiddle.sencha.com/#view/editor&fiddle/34bd

标签: javascript extjs extjs7


【解决方案1】:

我正在尝试按照您的建议了解用户点击的位置,但我不知道如何。

正如@LightNight 所说,您可以在选择之前使用childtap 事件来运行所需的处理程序。如果您想了解点击发生的位置 - 只需使用 event.target。看我的example

【讨论】:

    【解决方案2】:

    列表的 onItemDisclosure 属性而不是链接怎么样?

    使用 onItemDisclosure 函数并选择监听器来分离两个动作。

    onItemDisclosure:布尔值/函数/字符串/对象 BINDABLE

    设置为 true 以在每个列表项上显示一个披露图标。然后该列表将触发公开事件,并且该事件可以在 childtap 之前停止。通过将此配置设置为一个函数,传递的函数将在点击披露时被调用。这可以是函数对象或 Ext.app.ViewController 方法的名称。

    最后,您可以指定一个定义了范围和处理程序属性的对象。这也将绑定到点击事件侦听器,并且在您想要更改处理程序的范围时很有用。

    xtype: 'list',
    itemTpl: [
        '<div class="contact">',
        '<b>',
        '{firstName} {lastName}',
        '</b>',
        '</div>'
    ],
    onItemDisclosure: function (record, btn, index) {
        console.log('Disclosure');
        Ext.Msg.alert('Tap', 'Disclose more info for ' + record.get('firstName'), Ext.emptyFn);
    },
    store: {
    
        data: [{
            firstName: 'Peter',
            lastName: 'Venkman'
        }, {
            firstName: 'Raymond',
            lastName: 'Stantz'
        }, {
            firstName: 'Egon',
            lastName: 'Spengler'
        }, {
            firstName: 'Winston',
            lastName: 'Zeddemore'
        }]
    },
    listeners: {
            select() {
                console.log('select');
            }
    }
    

    这里是fiddle 示例

    【讨论】:

    • 好主意,但我的真实数据有点复杂。我更新了小提琴(fiddle.sencha.com/#view/editor&fiddle/34bd),您建议使用 childtap 而不是选中。在这种情况下,我引用了单击的元素,因此我可以完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多