Child Dispatchers
Child dispatchers is an elegant way to divide logic in your application.
Child dispatcher is an isolated dispatcher with its own dispatcher groups, propagation and handlers that do not interfere with other dispatchers (the only exception being StopChildrenPropagation
)
Creating a child
const child = Dispatcher.child()
const child = Dispatcher.child()
Then you can register your handlers to child
.
Adding a child
Dispatcher on its own does nothing, it needs to be bound to a parent to become a child dispatcher. That is done simply by calling addChild
:
dp.addChild(child)
dp.addChild(child)
Only dispatchers that are not bound to a Client can be used as a child. This also means that a dispatcher can only be a child to one dispatcher, i.e. the following code will not work:
dp.addChild(child)
otherDp.addChild(child) // error!
dp.addChild(child)
otherDp.addChild(child) // error!
However, you can use .clone()
method to make this work:
dp.addChild(child)
otherDp.addChild(child.clone()) // ok
dp.addChild(child)
otherDp.addChild(child.clone()) // ok
Removing a child
When building some kind of modular architecture, it is useful to also remove a child dispatcher. Luckily, it is just as easy:
dp.removeChild(child)
dp.removeChild(child)
Do note, however, that if you are using a cloned dispatcher, calling removeChild
on the original dispatcher will do nothing. Instead, you have to store the reference to the cloned dispatcher:
const childClone = child.clone()
otherDp.addChild(childClone)
// later
otherDp.removeChild(childClone)
const childClone = child.clone()
otherDp.addChild(childClone)
// later
otherDp.removeChild(childClone)
Extending
Instead of using child dispatchers, you can extend the existing dispatcher with another one:
dp.extend(child)
dp.extend(child)
Note that in this case, child
will not be isolated, and its handler groups, children, scenes, etc. will be merged to the original dispatcher. If child
contains scenes with already registered names, they will be overwritten.
Extending will not work if the child is using a custom storage or a custom key delegate.
Using a dispatcher after it was .extend()
-ed into another dispatcher is undefined behaviour and should be avoided.