重新创建的活动项目不会添加到任何容器中

时间:2013-02-01 00:14:12

标签: 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 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项目。不知道为什么会这样。仍然不是一个真正的解决方案,这是一个黑客。

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)),重新创建视口中的所有原始项目,然后重新插入它们。每次没有插入项目时,我宁愿不必这样做。