Как 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 функция и, если найдено, генерируется ошибка.

Другие вопросы по тегам