Угловой компилятор использует следующее регулярное выражение для анализа селектора:
const _SELECTOR_REGEXP = new RegExp(
'(\\:not\\()|' + //":not("
'([-\\w]+)|' + // "tag"
'(?:\\.([-\\w]+))|' + // ".class"
// "-" should appear first in the regexp below as FF31 parses "[.-\w]" as a range
'(?:\\[([-.\\w*]+)(?:=([\"\']?)([^\\]\"\']*)\\5)?\\])|' + // "[name]", "[name=value]",
// "[name="value"]",
// "[name='value']"
'(\\))|' + // ")"
'(\\s*,\\s*)', // ","
'g');
Как вы можете видеть, селектора по идентификатору нет.
Более того, ваши селекторы #root
и #child
будут сопоставлены с root
и child
элементами.Итак, если вы замените <div id='child'></div>
на <child></child>
, дочерний компонент будет визуализирован.
Почему работает корневой селектор?
Это потому, что корневой компонент обрабатывается специально и загружается как динамический компонентиспользуя следующий код:
componentFactory.create(Injector.NULL, [], selectorOrNode, ngModule);
^^^^^^^^^^^^^^
#root
Где под капотом Angular использует document.querySelector(selectorOrNode)
для поиска выделенного элемента, если мы предоставили строку.
С другой стороны, все вложенные компоненты отображаются только еслиселекторы совпадают с элементами в шаблоне.