Ext.app.EventDomain
それ自体を使用することを意図したものではありません。むしろ、必要に応じてカスタムイベントドメインを実装できます。イベントドメインの背後にある考え方は非常に単純です。これは、Ext.Componentから派生したものではないアプリケーションパーツ間でイベントを渡す方法です。
最も頻繁に使用されるのはコントローラーバインディングです。4.1では、他のコントローラーのメソッドを直接呼び出すことしかできませんでした(ハードバインディング)。これはテストには非常に適していません。4.2では、代わりにコントローラーに他のコントローラーのイベントをリッスンさせ(ソフトバインディング)、次の代わりに明確なロジック分離を行うことができます。
Ext.define('MyApp.controller.Foo', {
extend: 'Ext.app.Controller',
doSomething: function() {
this.getController('Bar').doSomethingElse();
}
});
Ext.define('MyApp.controller.Bar', {
extend: 'Ext.app.Controller',
doSomethingElse: function() {
// The problem here is that this logic belongs to Bar controller
// but this method has to be called from Foo controller,
// which means Bar should always be around whenever Foo
// needs to call it. Race conditions, anyone?
...
}
});
できるよ:
Ext.define('MyApp.controller.Foo', {
extend: 'Ext.app.Controller',
doSomething: function() {
this.fireEvent('doSomethingElse');
}
});
Ext.define('MyApp.controller.Bar', {
extend: 'Ext.app.Controller',
init: function() {
this.listen({
controller: {
'*': { // '*' means any controller
doSomethingElse: this.doSomethingElse
}
}
});
},
doSomethingElse: function() {
// Not a problem anymore -- Foo fires an event, and if Bar
// happens to be around, it reacts and does whatever it wants;
// the benefit is that there is no direct method calling
// so we don't have to watch for exceptions and do other
// unnecessary stuff.
...
}
});
独自のイベントを聞くこともできます。これは、おそらく本番環境で使用するものではありませんが、コントローラーユニットテストに非常にうまく使用できる優れた副作用です。
他のコントローラーのイベントに加えて、コントローラーはストア、ダイレクトプロバイダー、およびグローバルイベントをリッスンできるようになりました。これは時々役立つ場合があります。
4.2がリリースされたら、これについて書き留める予定です。これがそれまで少し役立つことを願っています。