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()) には、3 つのアイテムがすべて存在します。ただし、実際に表示されるのは #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 で空白のアイテムが取得されないことがわかりました。なぜそうなのかはわかりません。まだ本当の解決策ではありません。これはハックです。

4

2 に答える 2

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))、ビューポートに元のアイテムをすべて再作成して、それらを再挿入することです。アイテムが挿入されないたびにこれを行う必要はありません。

于 2013-02-06T23:51:06.703 に答える