我在我的应用中遇到过这个问题:
假设我在旋转木马中有3个项目。我正在查看第2项。我需要重新加载那个轮播,所以我做了以下操作:
Ext.getCmp('carousel_name').removeAll();
var new_objects = (bunch of code that recreates the carousel's objects again, with the same IDs; this is the same code that was used to create the objects the first time, so it is likely not the issue)
Ext.getCmp('carousel_name').add(new_objects);
在轮播对象项目列表(Ext.getCmp('carousel_name').getItems()
)中,存在所有三个项目。但是,实际上只显示#1和#3(在轮播重新加载之前不是活动项目的那些)。 #2呈现一个空白的白色屏幕,除了项目外壳标记外,HTML中没有任何内容(没有我编写的代码显示)。如果我Ext.getCmp('carousel_item_2').show();
,项目确实出现,但是全屏,我收到错误:
[DEPRECATE][Ext.Panel#show] Call show() on a component that doesn't currently belong to any container. Please add it to the the Viewport first, i.e: Ext.Viewport.add(component);
当我尝试将该项目手动添加到视口或轮播时,没有任何修复。
我尝试在删除和重新插入新项目之间插入一个虚拟项目,但这不起作用。在执行任何此操作并在之后显示之前,也不会隐藏整个视口。也不使用setItems()
而不是add()
。也不是Ext.getCmp('exercises_carousel').each(function(item){ item.destroy(); })
而不是removeAll(true)
我不相信问题是重新创建新项目的代码片段,因为它与第一次创建项目时使用的代码相同,并且第一次创建时没有问题。
非常难过。
编辑:我发现如果当我到达旋转木马的末尾时,如果我在旋转木马的最后一个项目之后添加一个空项目,我就不会得到空白N-2项目。不知道为什么会这样。仍然不是一个真正的解决方案,这是一个黑客。
答案 0 :(得分:0)
假设你的代码片段没有问题重新填充你的轮播中的新项目,那么唯一的问题是因为这个问题(我不确定它是否是Sencha Touch 2.1中的错误,但它确实存在存在):当您拨打yourCarousel.removeAll()
并再次添加一些新项目时,您的轮播将不会设置正确的有效项目。
我已经看到了类似的问题,我在添加新项目后添加了这个,这有效:
carousel.setActiveItem(0);
答案 1 :(得分:0)
好吧,这是一个黑客,所以如果有人有合法的解决方案,那将是非常棒的。但黑客确实有效,所以这就是:
在代码中:
Ext.getCmp('carousel_name').add({});
Ext.getCmp('carousel_name').setActiveItem(Ext.getCmp('carousel_name').getMaxItemIndex());
Ext.getCmp('carousel_name').removeAll(true);
var new_objects = (bunch of code that recreates the carousel's objects again, with the same IDs)
Ext.getCmp('carousel_name').add(new_objects);
编辑:事实证明,由于某种原因,这种情况有90%的时间可以使用;由于某种未知原因10%的时间它仍然没有被插入。保证所有项目正确插入的唯一方法是清除整个视口(Ext.Viewport.removeAll(true)
),重新创建视口中的所有原始项目,然后重新插入它们。每次没有插入项目时,我宁愿不必这样做。