Похоже, у вас проблемы с идеей инкапсуляции. Дочерние компоненты не должны знать о родительских компонентах, а компоненты View не должны выполнять реальную работу, а только запрашивают работу у компонентов Controller. В очень простых проектах ваш компонент верхнего уровня может содержать логику контроллера, но многие люди предпочитают держать его отдельно даже в небольших проектах. Как это сделать, выходит за рамки этого ответа.
Итак, как родители и ребенок должны правильно общаться? Дочерние компоненты должны предоставлять свойства, которые родительский (или Framework, если вы чувствуете, что готовы использовать инфраструктуру внедрения зависимостей) может заполняться только теми данными, которые нужны дочерним компонентам.
Дочерние компоненты запрашивают работу от контроллера, генерируя события.
Итак, doLogin () будет содержать что-то вроде
dispatchEvent(new Event('doLogin'));
и родительский компонент будет прослушивать это событие. В его обработчике вы выполняете вход в систему. Скорее всего, ваш логин будет асинхронным, поэтому вам понадобится другой обработчик для прослушивания данных входа для возврата. Когда данные для входа возвращаются, вы задаете свойства в представлении входа в систему на основе возврата.