【问题标题】:ExtJS4 LinkButton ComponentExtJS4 链接按钮组件
【发布时间】:2012-03-24 10:37:03
【问题描述】:

我正在尝试在 Ext JS 4 中创建自己的 LinkBut​​ton 组件。没什么新东西,对吧?

我的代码如下所示:

Ext.define('LinkButton', {
    extend: 'Ext.Component',
    xtype: 'linkbutton',
    autoEl: 'a',
    renderTpl: '<a href=\"javascript:;\">{text}</a>',
    config: {
        text: '',
        handler: function () { }
    },
    initComponent: function () {
        var me = this;
        me.callParent(arguments);

        this.renderData = {
            text: this.getText()
        };

        var handler = me.getHandler();
        if (handler) {
            me.on('click', handler);
        }
    }
});

到目前为止一切顺利!我的 LinkBut​​ton 看起来确实像一个超链接,我的文本内容就在其中。优雅。

但是,当我单击组件时,我无法让组件触发事件!

me.on('click', handler); 这一行没有工作!即使我将它从 on 更改为 addListener 也没有效果。

所以问题是:如何将 DOM 事件添加到我的组件中?或者,更好的是,我如何访问我自己的组件的 DOM 元素?我什么都做不了!

谢谢!

【问题讨论】:

    标签: javascript html extjs components extjs4


    【解决方案1】:

    或者你可以这样做

    afterRender : function() {
        this.callParent(arguments);
    
        this.mon(this.el, {
            scope : this,
            delegate : 'a',
            click : this.handleClick
        });
    },
    
    handleClick : function(e, t) {
        e.stopEvent();
    
        var handler = this.getHandler();
        if (handler) {
            handler();
        }
    }
    

    【讨论】:

    • 这几乎是我在我的应用程序中所做的!我不熟悉 delegate 属性,我在文档中也没有看到它。它有什么作用?
    • 它接受一个元素的 DOM 选择器来触发监听器。所以点击监听器只会触发匹配“a”选择器的元素。如果 标签有一个类,例如 link 你可以使用 'a.test' 作为选择器。
    【解决方案2】:

    这是我的提议,它基于来自Button组件的源代码:

    Ext.define('LinkButton', {
        extend: 'Ext.Component',
        xtype: 'linkbutton',
        autoEl: 'a',
        renderTpl: '<a href=\"javascript:;\" id="{id}-btnEl">{text}</a>',
        config: {
            text: '',
            handler: function () { }
        },
        initComponent: function () {
            var me = this;
            me.callParent(arguments);
    
            this.renderData = {
                text: this.getText()
            };
        },
        onRender: function(ct, position) {
            var me = this, 
                btn;
    
            me.addChildEls('btnEl');
    
            me.callParent(arguments);
    
            btn = me.btnEl;
    
            me.mon(btn, 'click', me.onClick, me);
        },
        onClick: function(e) {
            var me = this;
            if (me.preventDefault || (me.disabled && me.getHref()) && e) {
                e.preventDefault();
            }
            if (e.button !== 0) {
                return;
            }
            if (!me.disabled) {
                me.fireHandler(e);
            }
        },
        fireHandler: function(e){
            var me = this,
                handler = me.handler;
    
            me.fireEvent('click', me, e);
            if (handler) {
                handler.call(me.scope || me, me, e);
            }
        }
    });
    

    工作样本:http://jsfiddle.net/lolo/AEwH4/1/

    【讨论】:

    • 今天我了解到我最初使用的 audoEl 配置由于模板中的 A 标签而导致了双 A 标签。删除它就可以了。
    【解决方案3】:

    正确的方法是使用Ext.view.View 来完成此类任务。有自定义的 html 可以让你做任何事情,同时 Ext.Component 的所有功能都可用。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2020-01-08
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多