Angular: как переопределить вложенный href с помощью routerLink?

У меня есть сторонний пакет, который использует атрибут href во вложенном теге привязки. Конечно, я не хочу использовать href. Я применил директиву routerLink к родительскому компоненту, потому что у меня нет возможности получить доступ к дочернему компоненту и изменить его. Но атрибут href отменяет все. Как заставить angular использовать директиву routerLink?

Мой код выглядит так:

<ngx-gallery routerLink="home" [options]="galleryOptions" [images]="galleryImages"></ngx-gallery>

person Nebex Elias    schedule 24.07.2020    source источник
comment
если он не может быть настроен в компоненте галереи, тогда единственный вариант - поймать щелчок, нажатие клавиши и, возможно, некоторые другие события в родительском элементе на этапе захвата события и остановить распространение этого события   -  person Andrei    schedule 24.07.2020
comment
Почему нажатие клавиш или другие события?   -  person Nebex Elias    schedule 25.07.2020
comment
потому что эти события также вызывают навигацию, когда ‹a href=...› находится в фокусе   -  person Andrei    schedule 25.07.2020


Ответы (1)


Прежде всего, в исходном коде и документации от ngx-gallery я не могу найти никаких ссылок на устанавливаемый тег привязки, но если вы скажете, что он есть, я должен вам поверить.

Однако вы можете попытаться вручную удалить значение href из тега привязки. Вы даже можете написать для него отдельную директиву:

@Directive({
  selector: '[disableLinks]'
})
export class DisableLinksDirective implements AfterViewInit, OnInit, OnDestroy {
  private destroy$ = new Subject<void>();

  constructor(
    private el: ElementRef<HTMLElement>
    @Optional() @Self() private gallery: NgxGalleryComponent
  ) {}

  ngOnInit(): void {
    if (this.gallery) {
      merge(
        this.gallery.imagesReady,
        this.gallery.change,
        this.gallery.previewChange
      ).pipe(
        takeUntil(this.destroy$)
      ).subscribe(() => this.disableLinks())
    }
  }

  ngAfterViewInit(): void {
    this.disableLinks();
  }

  ngOnDestroy(): void {
    this.destroy$.next();
    this.destroy$.complete();
  }

  private disableLinks(): void {
    this.el.nativeElement.querySelectorAll('a').forEach((a) => a.href = '');
  }
}

Что вы затем можете установить для своего элемента:

<ngx-gallery
  disableLinks
  routerLink="home"
  [options]="galleryOptions"
  [images]="galleryImages">
</ngx-gallery>

Я точно не знаю, вызовет ли какое-либо из этих событий повторное обновление href, но это вам решать :)

person Poul Kruijt    schedule 25.07.2020
comment
Что касается тега привязки, вот проблема: github.com/lukasz-galka/ngx -gallery / issues / 70 - person Nebex Elias; 25.07.2020
comment
@NebexElias Ага: D Похоже, я ошибался. он находится внутри миниатюрного изображения. Теперь я понимаю. Я могу обновить свой ответ, чтобы учесть это. - person Poul Kruijt; 25.07.2020
comment
Почему же человек, реализовавший пакет, использовал href? - person Nebex Elias; 27.07.2020