Fixed dispose process

Previously we dispose a control more than once if it is a child control
of another one, the first dispose is from parent's `disposeChildren`
and the second one is from itself, this is because two reasons:

1. We didn't detect lifecycle stage in `dispose` method
2. `initChildren` is implemented in a wrong method, which causes only
half of children could be disposed