Для первой части вашего вопроса я бы хотел уточнить:
Я не могу понять, почему вам нужно событие для обмена данными от потомка к родителю (@Output), в то время как @Input () отлично работает для родителя к потомку.
Поскольку Angular имеет однонаправленную систему обнаружения изменений, сверху вниз.
Это означает, что изменения в родительском элементе распространяются на дочерний элемент, а , а не , наоборот, в плане , что облегчает понимание потока состояния приложения.
Для связанных свойств (таких как те, которые отмечены @input
) изменение значения (для примитивов) или ссылки (для объектов) в родительском объекте вызовет обнаружение изменений, и дочерние элементы будут обновлены с новым значением или ссылка.
Однако, например, переназначение свойства @input
в дочернем элементе не приведет к обновлению ссылки в родительском элементе, поскольку это нарушит вышеупомянутый дизайн сверху вниз.
Хотя для выходов имеется декоратор , обнаружение изменений снизу вверх не происходит, поэтому об изменениях в этом направлении необходимо явно сообщить родителю, например, с событиями, которые точно что происходит.
Дальнейшее примечание
Несмотря на все это, все еще возможно, что изменения в связанном свойстве у дочернего элемента вызовут изменение, которое будет замечено в родительском. Это происходит, когда ссылка на объект передается дочернему элементу, а дочерний объект мутирует объект, используя ссылку, потому что, в конечном счете, это все еще Javascript, и родительский и дочерний элементы имеют ссылки на один и тот же объект. И если что-то иначе вызывает обнаружение изменений в родительском объекте, который обновляет DOM, и эффект этой мутации наблюдается на экране.
Однако этот код трудно понять и отладить, тогда как @output
декларативен и понятен.