Sencha touch 重新创建的活动项不存在';不要添加到任何容器中

Sencha touch 重新创建的活动项不存在';不要添加到任何容器中,sencha-touch,sencha-touch-2,Sencha Touch,Sencha Touch 2,我在我的应用程序中的几个地方遇到过这种情况: 让我们假设旋转木马中有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 c

我在我的应用程序中的几个地方遇到过这种情况:

让我们假设旋转木马中有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')。每个(函数(项){item.destroy();})
而不是
removeAll(true)

我认为问题不在于重新创建新项目的代码片段,因为它与第一次创建项目时使用的代码相同,并且在第一次创建时没有问题

这里很难办


<>强>编辑:< /强>我发现,如果到达转盘结束时,如果在转盘的最后一个项目之后添加一个空项,则不会在N-2处获得空白项。不知道为什么会这样。仍然不是一个真正的解决方案,这是一个黑客行为。

假设在您的代码片段中重新填充旋转木马中的新项目没有问题,那么唯一的问题就是因为这个问题(我不确定它是否是Sencha Touch 2.1中的一个bug,但它确实存在):当您调用
yourCarousel.removeAll()
并再次添加一些新项目时,您的转盘将无法设置正确的活动项目

我看到了一个类似的问题,我在添加新项目后添加了这个问题,这很有效:


carousel.setActiveItem(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)
),在视口中重新创建所有原始项目,然后重新插入它们。我不希望每次没有插入项目时都这样做。

不幸的是,这看起来并不能解决问题;所讨论的对象(无论在removeAll()之前是什么活动项)都不会插入到DOM中,即使它被插入到对象中(如Ext.getCmp('carousel_name')。getItems()。当您转到它在旋转木马中的位置时,它只是一个空白项。当您检查元素时,它只是一个空div。我不认为问题在于重新创建新项的代码段,因为它与第一次创建项时使用的代码相同,并且在第一次创建时没有问题。