Как отличить itemtap списка от события itemtaphold в Sencha Touch 2

Я новичок в Sencha Touch 2. Сегодня я столкнулся с проблемой: я хочу добавить события itemtap и itemtaphold в слушателях списка, но я не могу отключить itemtap при срабатывании itemtaphold. Обычно я бы использовал переменную типа dataView.config .istplhold, чтобы сделать это различие в контроллере, но он не работает в слушателях. Вот мой код:

    itemTpl: ['<table><tr>'+
          //'<td>{attachmentName}</td>'+
         '<td width="40px;">{i}</td>'+
         // '<td ><a  href="http://10.1.71.240:8080/tyoa/page/phone/request/leader/upload.jsp?attachmentId={attachid}&attachmentName={attachmentName}"  id="uploadFile" style="text-decoration:none;">{attachmentName}({attachmentSize})</a></td></div>'+
         '<td style="word-wrap:break-word;word-break:break-all;"><a style="text-decoration:none;">{attachmentName}({attachmentSize})</a></td>'+
         '<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>'+
         '<td style="white-space:nowrap;"><span id="'+'{attachid}'+'test_002" style="color:#FFCC00;"></span></td>'+ 
         '</tr></table>',   
     ].join(''),
    listeners:{
          itemtap:function(dataView, index, target, record, e, eOpts){
             //alert("download");
             if (!dataView.config.istplhold){
                var attachId=record.get('attachid');
                var attachName=record.get('attachmentName');
                // alert("attachId: "+attachId);
                //alert("attachName: "+attachName);
                $('#'+attachId+'test_002').text("Downloding...");
                window.downloader.downloadFile(Global.proxyPortAndIP+"/tyoa/temp/"+attachId+"?"+attachName, {overwrite: true},
                    function(res){
                        $('#'+attachId+'test_002').text(res.progress+"%");
                        if(res.progress==100){
                            Ext.Msg.alert(attachName,"Downloading complete");
                            $('#'+attachId+'test_002').text("Download complete");
                        }
                    },function(error){
                        alert(error);
                        $('#'+attachId+'test_002').text("Download failed");
                    }
                );
             }else{
                dataView.config.istplhold = false;
             }
           },

           itemtaphold:function(dataView, index, target, record, e, eOpts){
                var control = this;
                // if (Global.istaphold){
                    this.actions = Ext.Viewport.add({
                        xtype : 'actionsheet',
                        items : [{
                            text : 'Delete',
                            scope : this,
                            handler : function() {
                                Ext.Msg.confirm("Delete", "Are you sure to delete this item?", function(text) {
                                    if (text == 'yes') {
                                        // control.deleteContent(record.get('attachid'));
                                        var docbaseAttachmentId=record.get('attachid');
                                        Ext.data.JsonP.request({
                                            url : Global.API + '/docbase/docbaseListDelete.jsp',
                                            callbackKey : 'callback',
                                            params : {
                                                id : docbaseAttachmentId,
                                                format : 'json',
                                            },
                                            success : function(result) {
                                                reg = result[0].reg;
                                                if (reg == 'true') {
                                                    Ext.Msg.alert("", "Item deleted");
                                                }
                                                storeDocuments = Ext.getStore('docbaseAttachments');
                                                recordIndex = storeDocuments.findExact('attachid',docbaseAttachmentId);
                                                storeDocuments.removeAt(recordIndex);
                                                storeDocuments.sync();
                                            },
                                        });
                                    }
                                });
                                this.actions.hide();
                            }
                        },{
                            text : 'Modify',
                            scope : this,
                            handler : function() {
                                this.actions.hide();
                                // control.updateDocbaseListDetail(record);
                                view =Ext.create('tyoa.view.more.docbase.DocbaseListDetailPanel');
                                view.setRecord(record);
                                viewDirectionLeft(view);
                            }
                        },
                        {
                            xtype : 'button',
                            text : 'Cancel',
                            scope : this,
                            handler : function() {
                                this.actions.hide();
                            }
                        }]
                    });
                    this.actions.show();
                // }
                dataView.config.istplhold = !dataView.config.istplhold;
           },
    },

Также я вижу другое решение на форуме Sencha:

    listeners : {
        itemtap : function(list) {
            if (!list.lastTapHold || (list.lastTapHold - new Date() > 1000)) {
                console.log('itemtap');
            }
        },
        itemtaphold : function(list) {
            list.lastTapHold = new Date();
            console.log('itemtaphold');
        }
    }

но похоже, что его можно использовать только один раз, в любом случае, как сказал автор, это может привести к утечке памяти. Так что кто-нибудь может дать мне какие-нибудь предложения? Заранее спасибо!


person StarLeo    schedule 22.10.2013    source источник


Ответы (1)


вместо объявления событий в представлении вы можете объявлять их в контроллере .. как показано ниже, должно работать, попробуйте здесь имя представления списка - результат, вы можете объявить, что вы создали ..

Ext.define('MyApp.controller.Scanner', {
    extend: 'Ext.app.Controller',
    config: {
       control: {

            'Result list':{
                itemtap:'resultap',
                itemtaphold :'resulthold'
            }
        }
    },
    resultap:function(view, index, target, record, event){
                        alert('tap');
                    },
    resulthold:function(view, index, target, record, event){
                alert('taphold');

                }
                });
person codebreaker    schedule 23.10.2013
comment
Это в точности то, что я сделал вначале. Однако метод загрузки (запускаемый itemtap) зависит от itemTpl на странице просмотра, поэтому я не могу переместить его в контроллер, когда itemtaphold в контроллере и itemtap в представлении th трудно сделать отличить их друг от друга, поэтому я собрал их все вместе. @ codebreaker - person StarLeo; 23.10.2013
comment
k вы получаете оповещение для обоих событий при увольнении .. закомментируйте все коды и проверьте .. - person codebreaker; 23.10.2013
comment
Вы правы, мне действительно нужно поместить его в контроллер. Я просто подумал, что $ ('#' + attachId + 'test_002') не может быть достигнут в контроллере, который находится `` далеко '' от itemTpl, похоже, я ошибся Но какие методы нужно помещать в слушатели, а какие в Контроллере, всегда меня немного смущает. - person StarLeo; 24.10.2013