このメソッドを使用して、子フィールドからイベントをrelayEvents()
中継します。change
これを行う基本的なコードを次に示します。
Ext.define('My.Container', {
extend: 'Ext.Container'
,layout: 'form'
,initComponent: function() {
this.callParent(arguments);
// i want to support nested containers
this.parseContainerItems(this);
}
,onItemAdded: function(item) {
if (item instanceof Ext.Container) {
this.parseContainerItems(item);
} else if (item instanceof Ext.form.field.Base) {
this.relayEvents(item, ['change']);
}
}
,parseContainerItems: function(ct) {
if (ct.items) {
ct.items.each(this.onItemAdded, this);
}
}
});
使用例:
Ext.create('My.Container', {
renderTo: 'ct' // render to a test div
,height: 200
,width: 200
,items: [{
xtype: 'textfield', name: 'foo', fieldLabel: 'Foo'
},{
xtype: 'container'
,items: [{
xtype: 'checkbox', name: 'bar', fieldLabel: 'Bar'
}]
}]
,listeners: {
change: function(item, newValue, oldValue) {
console.log(Ext.String.format('Value of item {0} changed from {1} to {2}', item.name, oldValue, newValue));
}
}
});
もっと遠く行く...
前述したように、構成によってコンテナーに追加されるフィールドのみをサポートするため、私の実装は非常に初歩的なものです。そのコンポーネントを柔軟にしたい場合は、コンポーネントの作成後に追加されるフィールドを処理する必要があります。
そのためにadd
は、コンテナの作成後に追加されたフィールドから中継するコンテナのイベントを監視する必要があります。ドキュメントによると、このイベントは子コンテナーからバブルしますが、私のテストではそうではありません:-(したがって、(修正されるまでは?)add
子コンテナーのイベントも監視する必要があります。
parseContainerItems()
メソッドの更新されたコードは次のとおりです。
parseContainerItems: function(ct) {
ct.on('add', function(me, item) {
this.onItemAdded(item);
}, this);
if (ct.items) {
ct.items.each(this.onItemAdded, this);
}
}
フィールドを動的に削除する可能性もサポートしたい場合は、それがうまくいかないときです...relayEvents()
私の知る限り、イベントのリレーを停止することはできないため、独自のバージョンを実装する必要がありますExtによって提供されるもの。次に、イベントを監視して、remove
子フィールドとコンテナーに追加したリスナーを削除する必要があります。