ExtJS4 LinkButton Компонент - PullRequest
3 голосов
/ 07 марта 2012

Я пытаюсь создать свой собственный компонент LinkButton в Ext JS 4. Ничего нового, верно?

Мой код выглядит так:

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); не работает! Даже если я изменю его с на на addListener , это не даст никакого эффекта.

Итак, вопрос: как добавить события DOM в мой компонент? Или, что еще лучше, как мне получить доступ к элементу DOM моего собственного компонента? Я не смог этого сделать!

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 марта 2012

Или вы можете сделать это

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();
    }
}
2 голосов
/ 07 марта 2012

Вот мое предложение, основанное на источнике из 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/

0 голосов
/ 07 марта 2012

правильный способ - использовать Ext.view.View для таких задач.Существует специальный HTML, который позволяет вам делать все что угодно, и в то же время доступны все функции Ext.Component.

...