客户已经实现了一些“free html”组件,它是 HTML 的标题和包装器,与 OCC 响应一起作为内容。
这个 HTML 里包含了 anchor element:
不幸的是这个 a 标签导致页面重新加载并且不使用 Angular 路由,换言之,它会终止 SPA 的状态。
如何避免这种行为?比如实现一些侦听器并检查点击是否应该改为执行一些路由器操作并 prevent default?
https://github.com/SAP/spartacus/pull/15317/commits
解决方案的详细实现:
在 Angular module 里,导入 RouterModule
使用 @HostListener,拦截元素的 click 事件。
当 handleClick 方法触发时,说明宿主元素已经被点击了。此时判断 event 对象的类型是否为 HTMLAnchorElement
,如果是,说明确实是 a 这个元素被点击了。
然后使用 event 对象的 preventDefault 阻止 a 标签页造成的整个应用重新加载,然后使用 Angular route 的 navigate
进行页面内部跳转即可。
事件继续像往常一样传播,除非它的事件侦听器之一调用 stopPropagation() 或 stopImmediatePropagation(),其中任何一个调用都会立即终止事件的传播。