2011-03-20 16 views
12

Sto lavorando a un'applicazione Sencha Touch e ho un elenco di contatti. Toccando un elemento della lista, viene visualizzato un foglio di lavoro che mostra alcune funzioni di base (come chiamata, cancella e ignora). Purtroppo, quando i rubinetti degli utenti e l'ActionSheet viene licenziato, la voce Lista rimane selezionato sotto la sovrapposizione (vedi screenshot qui sotto):Sencha Touch - deseleziona l'elemento dell'elenco?

Screenshot of iOS Simulator

Ecco la funzione legata all'evento itemTap:

itemTap: function(list, index) 
{ 
    // Deselect the selected record: 
    var currentRecord = list.getStore().getAt(index); 
    currentRecord.forename  = currentRecord.get('forename'); 
    currentRecord.surname  = currentRecord.get('surname'); 
    currentRecord.phoneNumber = currentRecord.get('phoneNumber'); 
    currentRecord.shortFullName = currentRecord.forename + ' ' + currentRecord.surname[0]; 

    list.getStore().deselect(index, true); 

    callButton.setText('Call ' + currentRecord.shortFullName + ' (' + currentRecord.phoneNumber + ')'); 
    unfriendButton.setText('Remove ' + currentRecord.shortFullName + ' as friend'); 
    friendActionSheet.show(); 
} 

Purtroppo, list.getStore().deselect(index, true) restituisce il seguente errore: Object [object Object] has no method 'deselect'

Tutte le idee su che cosa potrei fare male, o come posso raggiungere questo obiettivo?

risposta

22

Questo funziona per me:

listeners: { 
     itemtap: function(dv, ix, item, e) { 
      // Clear the selection soon 
      setTimeout(function(){dv.deselect(ix);},500); 
     } 
    } 
+0

Grazie Chris, supponi che tu sia lo stesso Chris che lo ha affrontato nei forum di Sencha per me. Ha funzionato davvero, e ti ho dato alcuni oggetti di scena per il tuo aiuto! – BenM

+0

@Chris Grazie :) – Rupesh

+0

Preferisco questo metodo molto più del metodo 'disableSelection: true' menzionato di seguito (anche se funziona benissimo) perché questo evidenzia la selezione dell'utente come al solito, quindi deseleziona, mentre' disableSelection' non evidenzia mai una selezione a iniziare con. –

0

non ho cercato di ricreare il problema, ma si può provare:

list.deselect(currentRecord, true); 

Dopo avere effettuato che si può avere di chiamare

doLayout() 

o

doComponentLayout() 

per aggiornare la vista.

+1

Grazie a @ballmw, ma 'doLayout()' è un metodo della classe Container e non appartiene a un oggetto List. 'list.refresh()' cancella la selezione, ma rimuove anche l'evidenziazione blu temporanea che non è buona per HCI ... – BenM

+0

È bello vedere che hai trovato una risposta! – ballmw

0

Questo mi ha spinto folle.

Mentre la risposta approvato funzionerà, la sua pena di notare che si può fare con un ritardo (come lista annidata non troppo) in questo modo:

var selModel = app.views.VideosList.items.items[0].getSelectionModel(); 
    Ext.defer(selModel.deselectAll, 200, selModel); 

ho messo nel mio controller (quindi la sua chiamata quando la vista cambia), dove app.views.VideosList è il mio pannello principale e app.views.VideosList.items.items [0] è l'elenco in quel pannello.

2

Se si desidera cancellare l'intera lista:

var selModel = app.views.notesList.deselect(app.views.notesList.getSelectedRecords()); 
+0

Questo ha funzionato su un Ext.dataview.List, tranne che usando getSelection() invece di getSelectedRecords(). Era con Sencha Touch 2.1. –

1

setTimeout non è davvero una buona soluzione qui. Dovrebbe essere simile a questo:

listeners: { 
     itemtap: function(list, ix, item, e) { 
      // Clear the selection soon 
      list.deselect(list.getSelectedRecords()); 
     } 
    } 
+0

questo non sembra funzionare. L'ho provato prima così. – Farish

11

In Sencha Touch 2, utilizzare disableSelection: vero, durante la creazione di un elenco

Ext.define('App.view.NewsList',{ 
extend: 'Ext.List', 
xtype: NEWS_LIST, 

config: { 
    store: NEWS_FEED, 
    //deselectOnContainerClick: true,// not working in Sencha Touch 2 
    disableSelection: true, // since Sencha Touch 2 
    itemTpl: '{heading}' 
} 
}); 
+3

In caso di ** nestedlist ** è anche possibile utilizzare questa opzione. Ma devi aggiungerlo alla proprietà 'listConfig' in questo modo:' listConfig: {disableSelection: true} ' –

+0

Per alcune applicazioni di nestedList puoi anche impostare la proprietà' allowDeselect' su true. –

0

questo ha fatto per me (sencha tocco 2.3):

list = Ext.Viewport.down('nestedlist'); 
list.getActiveItem().deselectAll();