Javascript Sencha Touch-取消选择列表项?

Javascript Sencha Touch-取消选择列表项?,javascript,sencha-touch,Javascript,Sencha Touch,我正在开发Sencha Touch应用程序,并且有一个联系人列表。点击列表项时,将显示一个操作表,其中显示一些基本功能(如调用、删除和忽略)。不幸的是,当用户点击并触发ActionSheet时,列表项在覆盖下仍处于选中状态(请参见下面的屏幕截图): 下面是绑定到itemTap事件的函数: itemTap: function(list, index) { // Deselect the selected record: var currentRecord = list.getSt

我正在开发Sencha Touch应用程序,并且有一个联系人列表。点击列表项时,将显示一个操作表,其中显示一些基本功能(如调用、删除和忽略)。不幸的是,当用户点击并触发ActionSheet时,列表项在覆盖下仍处于选中状态(请参见下面的屏幕截图):

下面是绑定到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();
}
不幸的是,
list.getStore().deselect(index,true)
返回以下错误:
Object[Object Object]没有方法“deselect”


关于我可能做错了什么,或者如何做到这一点,你有什么想法吗?

我没有试图重现你的问题,但你可能想试试:

list.deselect(currentRecord, true);
这样做之后,您可能需要打电话

doLayout()

刷新视图。

这对我很有用:

    listeners: {
        itemtap: function(dv, ix, item, e) {
            // Clear the selection soon
            setTimeout(function(){dv.deselect(ix);},500);
        }
    }
这让我发疯

虽然批准的答案会起作用,但值得注意的是,您可以延迟(就像嵌套列表一样)这样做:

    var selModel = app.views.VideosList.items.items[0].getSelectionModel();
    Ext.defer(selModel.deselectAll, 200, selModel);
 listeners: {
        itemtap: function(list, ix, item, e) {
            // Clear the selection soon
            list.deselect(list.getSelectedRecords());
        }
    }

我将其放在我的控制器中(视图更改时称为app.views.VideosList),其中app.views.VideosList.items是我的主面板,app.views.VideosList.items.items[0]是该面板中的列表。

如果要清除整个列表:

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

setTimeout
在这里确实不是一个好的解决方案。应该是这样的:

    var selModel = app.views.VideosList.items.items[0].getSelectionModel();
    Ext.defer(selModel.deselectAll, 200, selModel);
 listeners: {
        itemtap: function(list, ix, item, e) {
            // Clear the selection soon
            list.deselect(list.getSelectedRecords());
        }
    }

在Sencha Touch 2中,在创建列表时使用disableSelection:true

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}'
} 
});
这为我做到了(sencha touch 2.3):


谢谢@ballmw,但是
doLayout()
是容器类的方法,不属于列表对象
list.refresh()
清除选择,但同时删除对HCI不好的临时蓝色突出显示…很高兴看到您找到了答案!谢谢Chris,假设你就是在Sencha论坛上为我解决这个问题的Chris。它确实起了作用,我给了你一些道具来帮助你!我更喜欢这种方法,而不是下面提到的
disableSelection:true
方法(尽管效果很好),因为它会像往常一样突出显示用户的选择,然后取消选择它,而
disableSelection
从不突出显示要开始的选择。在nestedlist的情况下,也可以使用该选项。但是您必须将它添加到
listConfig
属性中,如下所示:
listConfig:{disableSelection:true}
对于nestedList的某些应用程序,您还可以将
allowDeselect
属性设置为true。这在Ext.dataview.List上起作用,除了使用getSelection()而不是getSelectedRecords()。这就是Sencha Touch 2.1。