EXTJS: как добавить событие щелчка на узле значка на панели дерева

Я пытаюсь получить событие, щелкнув значок узла на панели дерева.

У меня есть дерево со многими узлами, а перед листовым узлом у меня есть значок. На данный момент, когда я нажимаю на узел, я отображаю файл PDF.

Я хочу выполнить определенное действие, когда я нажимаю значок этого узла.

У кого-то есть идея сделать это?

Большое спасибо за ваши будущие ответы!

РЕДАКТИРОВАТЬ: Спасибо за ваш ответ,

@Hown_: Хорошо, но я должен выполнить конкретное действие, которое зависит от выбранного узла. С помощью селектора CSS я не могу этого сделать. Я не прав?

@budgw: Да, это хорошее решение, но моя иконка должна быть перед текстовым узлом :(


person Kalyh    schedule 08.08.2014    source источник


Ответы (3)


Я предполагаю, что самым простым способом было бы добавить событие itemclick к вашему TreePanel и проверить в обработчике fn, был ли нажат значок дерева, проверив цель события. Это работает так просто:

Возможно, вам придется изменить селектор css getTarget fn для вашего конкретного использования. (например, только листовые элементы или значки PDF или что-то в этом роде)

Ext.onReady(function() {
    var store = Ext.create('Ext.data.TreeStore', {
        root: {
            expanded: true,
            children: [{
                text: "detention",
                leaf: true
            }, {
                text: "homework",
                expanded: true,
                children: [{
                    text: "book report",
                    leaf: true
                }, {
                    text: "alegrbra",
                    leaf: true
                }]
            }, {
                text: "buy lottery tickets",
                leaf: true
            }]
        }
    });    

    Ext.create('Ext.tree.Panel', {
        title: 'Simple Tree',
        width: 200,
        store: store,
        rootVisible: false,
        renderTo: Ext.getBody(),

        listeners: {
            itemclick: function(treeModel, record, item, index, e, eOpts){
                var iconElClicked = e.getTarget('.x-tree-icon');

                if(iconElClicked){
                    //tree icon clicked 

                    //do something in here
                    console.log('tree icon clicked');
                }
            }
        }

    });
});
person JuHwon    schedule 11.08.2014
comment
Здорово! Это решение работает отлично! :) Большое спасибо! - person Kalyh; 11.08.2014

Я не думаю, что вы можете сделать это со значком перед узлом (может быть, я ошибаюсь).

Но я обычно решаю такой вариант использования, используя древовидную панель с двумя столбцами:

  • деревоколонна
  • столбец действий, как в этом примере здесь.

Хитрость заключается в использовании свойства конфигурации «hideHeaders:true» на панели дерева, чтобы оно выглядело как классическое дерево.

person budgw    schedule 08.08.2014
comment
Да, это хорошее решение, но моя иконка должна быть перед текстовым узлом :( - person Kalyh; 08.08.2014

Вы можете выбрать элементы dom значков с помощью селектора css и добавить событие клика после метода рендеринга.

вот пример: https://fiddle.sencha.com/#fiddle/8kd

ОБНОВЛЕНИЕ:

пример:

Ext.onReady(function() {
    var store = Ext.create('Ext.data.TreeStore', {
        root: {
            expanded: true,
            children: [{
                text: "detention",
                leaf: true
            }, {
                text: "homework",
                expanded: true,
                children: [{
                    text: "book report",
                    leaf: true
                }, {
                    text: "alegrbra",
                    leaf: true
                }]
            }, {
                text: "buy lottery tickets",
                leaf: true
            }]
        }
    });

    Ext.define('MyPanel', {
        extend: 'Ext.tree.Panel',
        title: 'Simple Tree',
        width: 200,

        onTreeIconClick: function(treeModel, record, item, index, e, eOpts){
            // DO SOMETHING IN HERE    
            console.log('onTreeIconClicked');
        },

        render: function(){                
            this.callParent(arguments);

            var domEls = this.el.dom.querySelectorAll('#' + this.getId() + ' .x-tree-icon', this.el.dom);

            for(var i = 0; i<domEls.length; i++){
                Ext.get(domEls[i]).on('click', function(){                    
                    //click on tree icon

                    this.on('itemclick', this.onTreeIconClick, this, { single: true });                                                     

                }, this);
            }           

        }
    });


    Ext.create('MyPanel', {

        store: store,
        rootVisible: false,
        renderTo: Ext.getBody()

    });
});
person JuHwon    schedule 08.08.2014
comment
вы также можете изменить селектор в моем примере. например чтобы выбрать только ваши значки PDF - person JuHwon; 08.08.2014
comment
Хорошо, но я должен выполнить конкретное действие, которое зависит от выбранного узла. С помощью селектора CSS я не могу этого сделать. Я не прав? - person Kalyh; 08.08.2014
comment
я обновил скрипку. я только что добавил одно событие выбора в TreePanel, которое будет запущено сразу после нашего события щелчка;) Теперь вы можете получить доступ к выбранной записи в этой функции. - person JuHwon; 10.08.2014
comment
извините - событие выбора не является правильным (с ним будут ошибки), вы должны использовать событие itemclick. Снова обновил Fiddle. Теперь это работает. - person JuHwon; 11.08.2014
comment
Это хороший способ! Но он никогда не входит в событие click. Ext.get(domEls[i]).on('click', function(){ //щелкнуть значок дерева this.on('select', this.onTreeIconClick, this, { single: true }); }, this ); Никогда не входите в это, и поэтому никакое событие на дереве не определено, и я не понимаю, почему :( Вы можете мне помочь? - person Kalyh; 11.08.2014
comment
Вы уверены, что ваш селектор css правильный? ваш массив domEls пуст? Если нет: предоставьте исходный код через pastebin или что-то из вашего рендера fn. Если он пуст: проверьте свой селектор css. Вы знаете, как это сделать? какие классы даны в вашем теге значка? - person JuHwon; 11.08.2014