Если вы просто хотите повторно использовать один и тот же шаблон для дочерних и родительских компонентов, вам просто нужно поместить этот шаблон в файл html и ссылаться на него с помощью templateUrl
. Ваши подписки будут унаследованы, и вы сможете получить доступ к publi c защищенным и защищенным переменным из дочернего компонента.
Теперь, если вы хотите унаследовать родительский шаблон, но сможете вносить изменения в шаблон , это немного сложнее, потому что angular не обеспечивает наследования шаблонов.
Возможной альтернативой является использование механизма шаблонов для генерации html. В одном из наших проектов мы использовали nunjucks , чтобы обойти это ограничение.
Итак, по сути, вы указываете html родительского компонента, используя шаблон nunjucks
parent.component. html .njk
<div>
Parent template
{% block specific %}
{% endblock %}
</div>
parent.component.ts
@Component ({
selector: 'app-parent',
templateUrl: `parent.component.html`, //Reference compiled template (not .njk)
})
export class ParentComponent
{
//...
И затем вы также определяете свой дочерний компонент как шаблон nunjucks, который наследуется от родительского шаблона
child.component. html .njk
{% extends '/path/to/parent/parent.component.html.njk' %}
{% block specific %}
Child content: {{childContent}}
{%endblock %}
child.component.ts
@Component ({
selector: 'app-child',
templateUrl: `child.component.html`, //reference .html, not .njk
})
export class ChildComponent extends ParentComponent
{
public childContent = "hello";
//Access to public/protected members and methods from parent componenent
Вдобавок к этому у нас есть базовый c сценарий просмотра, который отслеживает изменения файла .njk и генерирует соответствующие html
часы. js
const nunjucks = require('nunjucks');
//Nunjuck config to use <$ and $> for tags, instead of {{ and }}, to avoid conflicting with angular
const nunjucksEnv = nunjucks.configure(
{
noCache: true,
tags:
{
variableStart: '<$',
variableEnd: '$>',
}
}
);
//Add watch loop here. Whenever a njk file changes, call the code below
nunjucks.render(njkTemplateFileThatJustChanged, {}, function (err, html)
{
if (!err)
{
let compiledPath = njkTemplateFileThatJustChanged.replace('.njk', '');
fs.writeFileSync(compiledPath, html);
}
}