ExtJS4 链接按钮组件

3

我正在尝试在Ext JS 4中创建自己的LinkButton组件。这并不是什么新鲜事,对吧?

我的代码如下:

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);
        }
    }
});

到目前为止,一切都很好!我的LinkButton看起来像一个超链接,我的文本内容也在里面。优美。
然而,当我点击它时,无法使组件触发事件!
这行代码“me.on('click', handler);”不起作用!即使我将其从“on”更改为“addListener”,也没有任何效果。
所以问题是:如何向我的组件添加DOM事件?或者,更好的是,如何访问自己组件的DOM元素?我一直无法做到这些!
谢谢!
3个回答

3
您可以这样做:

或者您可以采用以下方法

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"属性,并且在文档中找不到它。它是做什么用的? - Sean Adkinson
2
它接受一个DOM选择器,以便监听器触发。因此,点击监听器仅对与'a'选择器匹配的元素触发。如果<a>标签例如<a class="test">link</a>有一个类,那么您可以使用'a.test'作为选择器。 - Mitchell Simoens

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);
        }
    }
});

Working sample: http://jsfiddle.net/lolo/AEwH4/1/


今天我学到了,我最初使用的audoEl配置由于模板中的A标签导致了双重A标签。只需删除它,一切就会好起来。 - Fábio Gusmão Ribeiro

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接