私は、折りたたまれたパネルを動的に生成するページを作成しています。ユーザーがこれらのパネルを展開すると、GETリクエストが実行され、生成されたパネルにJSON応答が入力されます。最初に表示されるデータの量が圧倒的に大きくなる可能性があるため、一種のレイジーロードまたは必要なロードを実行することです。Extjs 5.1.2動的に生成された要素のリスナー
しかし、私のパネルが動作するようにリスナーを得ることはできないようです。ここで
は、ボタンのクリック機能によってパネルを生成するコード、次のとおりです。もともと
xtype : 'button',
listeners : {
click : function (button, e, eOpts) {
console.log("Click function");
Ext.Ajax.request({
url: 'data/Countries.json',
success: function(response, options) {
var data = Ext.JSON.decode(response.responseText).results;
var container = Ext.getCmp('panelContainer');
container.removeAll();
for (i = 0; i < data.length; i++)
{
container.add({
xtype: 'panel',
title: 'Country Name - ' + data[i].countryName,
collapsible: true,
listeners: {
expand: function() {
Ext.Ajax.request({
url: 'data/CountryData.json',
success: function(response, options) {
var data = Ext.JSON.decode(response.responseText).results;
var me = this;
me.add({
xtype: 'grid',
store: Ext.create('Ext.data.Store',
{
fields : [{
name: 'gdp'
}, {
name: 'rank'
}, {
name: 'founded'
}, {
name: 'governor'
}, {
name: 'notes'
}], //eo fields
data: data.information,
}),// eo store
columns: [
{ text: 'GDP', dataIndex: 'gdp'},
{ text: 'rank', dataIndex: 'rank'},
{ text: 'Date', dataIndex: 'founded'},
{ text: 'name', dataIndex: 'governor'},
{ text: 'Notes', dataIndex: 'notes', flex: 1, cellWrap: true}
], //eo columns
autoLoad: true
});
},
failure: function(response, options) {}
});
},
collapse: function() {
console.log("Collapse function");
var me = this;
me.removeAll();
}
}//eo panel listeners
});//eo cont.add()
}//eo for loop
}, //eo success
failure: function(response, options) {
//HTTP GET request failure
}//eo failure
});//eo Ajax request
} //eo click
}//eo button listeners
、パネルは、動的に完全に働いたクリックイベントから、彼らの人口のグリッドに沿って発生させました。動的に生成されたパネル上のリスナーにグリッド作成をラップして、必要に応じてロードを作成することで、リスナーの展開または折りたたみをトリガーすることができません。
私が試したことのない解決策の1つは、カスタムコンポーネントを作成して、インラインですべてをビルドするのではなくxtypeで呼び出すことです。リスナーを関数に入れ子にするのではなく、これは、読みやすく再利用可能なコードにとっても優れていますが、今のところ根本的に解決しようとしています)。
動的に生成されるパネル上のリスナーに問題はありますか?イベントが崩壊と拡大の原因となった理由は何ですか?
ありがとうございました!
私はちょうど(Container.addの 'でパネルを移動しました) 'をそれ自身のコンポーネントに変換し、xtypeを通してそれを呼び出しました。私はトリガするexpand関数を得ることができますが、リスナのコンポーネントを取得する方法はわかりません(私は 'var me = this; me.add()'と推測していました)。また、不思議なことに、私がコンテナとして使用していたアウターパネルが突然倒れてヘッダーがついてしまったので、それを調べなければなりません。 – aaron
Offtopic:リスナー関数をビューから切り離すか、少なくともlistenerScopeを使用して項目定義の下に記述することをお勧めします。また、そのストアは、クラス全体または異なるファイルで定義することができ、スパゲッティコードのように見えるので、名前などで呼び出されます。リスナーのためにこのフィドルをチェックしてください。https://fiddle.sencha.com/#fiddle/1brb – pagep
確かに、私はそれらを分けることになります。私はちょうど始めたばかりなので、別のファイルにストアを設定し、グリッドの設定やリスナーを適切に使用する方法によって異なるセットのデータを渡す方法はあまりよく分かりませんでした。私はそれが私が思っているよりも簡単だと確信しています。あなたのリスナー機能が正しく発射されているのがわかります。リスナーが発砲していない理由はありますか? listenerScopeを使用する必要がありますか?私はテストを続けます。ありがとう! – aaron