1

我在我的应用程序的几个地方遇到了这个问题:

假设我在轮播中有 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);

当我尝试手动将该项目添加到视口或轮播时,没有任何问题是固定的。

我尝试在移除和重新插入新项目之间插入一个虚拟项目,但这不起作用。也不会在执行任何此操作之前隐藏整个视口并在之后显示它。usingsetItems()而不是add(). 做Ext.getCmp('exercises_carousel').each(function(item){ item.destroy(); })而不是removeAll(true)

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

在这里很困惑。

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

4

2 回答 2

0

假设在您的代码片段中重新填充轮播中的新项目没有问题,那么唯一的问题是因为这个问题(我不确定这是否是 Sencha Touch 2.1 中的错误,但确实存在):当您再次调用yourCarousel.removeAll()并添加一些新项目时,您的轮播将不会设置正确的活动项目。

我见过类似的问题,我在添加新项目后添加了这个,它有效:

carousel.setActiveItem(0);

于 2013-02-04T08:56:05.520 回答
0

好吧,这是一个 hack,所以如果有人有一个合法的解决方案,那就太棒了。但是黑客确实有效,所以这里是:

  • 在轮播中添加一个空项目
  • 将活动项目设置为新的空轮播项目
  • 销毁所有轮播物品
  • 重新创建(并重新添加)所有项目

在代码中:

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

于 2013-02-06T23:51:06.703 回答