Ext.app.EventDomain
本身不打算使用;相反,如果需要,您可以实现自定义事件域。事件域背后的想法非常简单:它是一种在碰巧不是 Ext.Component 派生的应用程序部分之间传递事件的方法。
最常用的是Controller绑定:在4.1中只能直接调用其他Controller的方法(硬绑定),这对测试非常不利。在 4.2 中,您可以让 Controller 监听其他 Controller 的事件(软绑定)并具有清晰的逻辑分离,因此可以代替:
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.
...
}
});
听你自己的事件也可以——这不是你可能在生产中使用的东西,但它是一个很好的副作用,可以非常成功地用于控制器单元测试。
除了其他 Controller 的事件之外,Controller 现在还可以监听 Store、Direct 提供程序和全局事件,这有时可能很有用。
我计划在 4.2 发布时写下这个;希望在此之前这会有所帮助。