Как Angular-компилятор обрабатывает несколько ссылочных переменных шаблона с одним и тем же именем
Я хочу начать вносить вклад в angular, у меня есть идея для функции, я хочу, чтобы компилятор шаблонов выдавал предупреждение, если шаблон содержит две переменные шаблона с одним и тем же именем. Я думаю, что мне удалось подобраться ближе к ответственным файлам: https://github.com/angular/angular/blob/master/packages/compiler/src/view_compiler/view_compiler.ts но я не смог найти это место, по понятным причинам., Есть ли здесь кто-нибудь, кто может направить меня?
1 ответ
Вам нужно изучить метод _assertNoReferenceDuplicationOnTemplate:
_assertNoReferenceDuplicationOnTemplate(result: TemplateAst[], errors): void {
const existingReferences: string[] = [];
result.filter(element => !!(<any>element).references)
.forEach(element => (<any>element).references.forEach((reference: ReferenceAst) => {
const name = reference.name;
if (existingReferences.indexOf(name) < 0) {
existingReferences.push(name);
} else {
const error = new TemplateParseError(
`Reference "#${name}" is defined several times`, reference.sourceSpan,
ParseErrorLevel.ERROR);
errors.push(error);
}
}));
}
Угловой компилятор создает AST с одним типом узла ElementAST, который имеет references
имущество:
export class ElementAst implements TemplateAst {
constructor(
public name: string,
public references: ReferenceAst[],
...
И это свойство, которое проверяется в _assertNoReferenceDuplicationOnTemplate
функция и, если найдено, генерируется ошибка.