Использование @Component в качестве @Directive: ошибка lint

#angular #static-analysis #lint

#angular #статический анализ #lint

Вопрос:

Я хочу использовать @Component внутри таблицы, но я думаю, что не смогу использовать Angular
<tags> внутри элементов <tr> таблицы. Я не могу использовать @Directive , потому что я хочу включить html. Что мне делать?

У меня есть следующее в my-page.html :

 <tr my-tag SOME_THINGS></tr>
  

Затем, в my-component.ts я имею

 @Component({
  selector: '[my-tag]',
  templateUrl: './my-tag.html',
  styleUrls: ['./my-tag.scss']
})
  

и в my-component.html у меня есть:

 <td>blah blah blah</td>
  

@Component вызывается внутри tr как директива, но это не так, потому что я хочу включить в нее некоторый html.

При этом возникает следующая tslint ошибка:

В качестве элемента следует использовать селектор компонента «my-tag» (https://angular.io/styleguide#style-05-03 ) (компонент-селектор)

Если я сделаю следующее:

 @Component({
  selector: 'app-my-tag',
  templateUrl: './my-tag.html',
  styleUrls: ['./my-tag.scss']
})
  

вместе с

 <tr><app-my-tag></app-my-tag></tr>
  

Я не получаю ошибок lint, но для меня это выглядит действительно странно, и я теряю стиль строк.

Какое было бы возможным решением?

Спасибо!

Комментарии:

1. Директивы могут манипулировать DOM . Используйте директиву.

2. Директивы могут манипулировать DOM, но могут ли они добавлять html? Я думаю, что нет. Извините, но я не совсем понимаю ваше замечание … 🙁

3. Манипулирование DOM на самом деле более эффективно, чем возможность «добавить html» через компонент — вы можете условно добавлять, удалять или изменять существующие элементы в DOM, проанализированные из html-документа или фрагмента.

4. Это звучит действительно интересно! Знаете ли вы какую-либо ссылку на то, как разобрать HTML-документ? Спасибо!

Ответ №1:

Да, вы можете добавлять html-элементы из директивы. Вот как:

 import { AfterViewInit, Directive, ElementRef, Renderer2 } from '@angular/core';

@Directive({
  selector: '[appTestDir]'
})
export class TestDirective implements AfterViewInit {
  constructor(private elRef: ElementRef, private renderer: Renderer2){}

  ngAfterViewInit(): void {
    const div = this.renderer.createElement('div');
    const divText = this.renderer.createText('I am text inside div');
    this.renderer.appendChild(div, divText);
    this.renderer.appendChild(this.elRef.nativeElement, div);
  }
}
  

В вашем HTML

 <td appTestDir>Blah Blah Blah</td>
  

Это приводит к:
Бла-Бла-бла, я текст внутри div

Не забудьте добавить свою директиву в массив declarations в NgModule.

Комментарии:

1. Но текст в createText состоит из целых 135 строк HTML-файла. Либо есть возможность включить его внешнее содержимое, либо код получится довольно уродливым…

2. Вы можете оформить вновь созданные разделы по своему усмотрению.

Ответ №2:

просто используйте selector: 'tr[my-tag]' . С помощью таких селекторов вы определяете свои конкретные tr s

Комментарии:

1. Если я использую это обозначение, я получаю ошибку lint The selector of the component "my-component" should be named kebab-case and include dash (https://angular.io/styleguide#style-05-02) . Итак, похоже, это не решает мою проблему …?