在[innerHTML]中使用Angular routerLink

8
我一直在寻找一种方法,使标准的a[href]链接在动态加载到[innerHTML]时能像routerLinks一样工作。似乎这不是一个标准的做法,我找不到任何可以满足我的需求的东西。
我有一个可行的解决方案,但想知道是否有更好的方法来解决这个问题,或者我用这种方式可能会遇到什么潜在问题。
我在app-routing.module.ts中使用jQuery,因此我声明了变量:
declare var $:any;

我会找到所有带有href属性但没有routerlink属性的锚点。然后,我可以获取路径名并告诉路由器在单击时导航到该路径。

$(document).on('click', `a[href]:not("a[routerlink]"):not("a[href^='mailto:']"):not("a[href^='tel:']")`, function(e){
    if(location.hostname === this.hostname || !this.hostname.length){
        e.preventDefault();
        router.navigate([this.pathname]);
    }
});

这种方法似乎可以完成工作,但我认为应该有一种更“Angular”的方法来实现这个功能...

1个回答

1
这可能不是最好的方法,但你可以使用 RendererElementRef 来为锚标签添加事件监听器,如 this article 中所讨论的那样。

@Component({
  selector: 'app-example-html',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.less'],
})
export class ExampleComponent implements AfterContentInit {

  private clickListeners: Array<(evt: MouseEvent) => void> = [];

  constructor(
    private router: Router,
    private el: ElementRef,
    private renderer: Renderer2,
  ) { }

  ngAfterViewInit() {
    const anchorNodes: NodeList = this.el.nativeElement.querySelectorAll('a[href]:not(.LinkRef)'); // or a.LinkPage

    const anchors: Node[] = Array.from(anchorNodes);

    for (const anchor of anchors) {
      // Prevent losing the state and reloading the app by overriding the click event
      const listener = this.renderer.listen(anchor, 'click', (evt: MouseEvent) => this.onLinkClicked(evt));
      this.clickListeners.push(listener);
    }
  }

  private onLinkClicked(evt: MouseEvent) {
    evt.preventDefault();
    if (evt.srcElement) {
      const href = evt.srcElement.getAttribute('href');
      if (href) {
        this.router.navigateByUrl(href);
      }
    }
  }
}



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接