为什么Angular canActivate功能防护在导航路线时执行了两次

时间:2018-03-20 13:46:53

标签: angular

我使用Angular 5并定义了几条路线。当我在canActivate函数保护中导航路径并设置断点时,我看到它被执行了两次。

我问这个是因为我必须在每次canActivate调用上调用外部服务,并且多次无用地执行相同的服务会导致不必要的开销。

4 个答案:

答案 0 :(得分:2)

刚好发生在我身上,问题出在我的import sys from PySide import QtGui, QtCore ################################################################################ # Bakers ################################################################################ class Baker(QtGui.QWidget): def __init__(self, name): self.name = name class Baker_John(Baker): def __init__(self): Baker.__init__(self, name='John') class Baker_Amy(Baker): def __init__(self): Baker.__init__(self, name='Amy') class Baker_Makela(Baker): def __init__(self): Baker.__init__(self, name='Makela') class Baker_Jeff(Baker): def __init__(self): Baker.__init__(self, name='Jeff') ################################################################################ # Action ################################################################################ class MyAction(QtGui.QAction): on_action = QtCore.Signal(dict) def __init__(self, user_info, *args, **kwargs): super(MyAction, self).__init__(*args, **kwargs) self.ui = user_info self.triggered.connect(self.on_triggered) def on_triggered(self): print('UI:', self.ui) self.on_action.emit(self.ui) class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.resize(200, 300) # OBJECTS - variable containing list of class objects created ACTIVE_BAKERS = [] # CONTROLS self.ui_items = QtGui.QListView() self.ui_items.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.ui_items.customContextMenuRequested.connect(self.open_tasks_contextmenu) self.setCentralWidget(self.ui_items) self.create_context_menu_ui() # dynamically create the menu def create_context_menu_ui(self): self.add_baker = QtGui.QMenu("Add") AVAILABLE_BAKERS = [Baker_John(), Baker_Amy(), Baker_Makela(), Baker_Jeff()] for x in AVAILABLE_BAKERS: new_action = MyAction(x, x.name, self) self.add_baker.addAction(new_action) self._cmenu = QtGui.QMenu() self._cmenu.addMenu(self.add_baker) def open_tasks_contextmenu(self, position): self._cmenu.exec_(QtGui.QCursor.pos()) def main(): app = QtGui.QApplication(sys.argv) ex = MainWindow() ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main()

中的这个片段
AuthGuard

它执行了两次,因为它设置了一个值,重定向,然后跳过了auth,因为它立即解析为setActiveWebsite(website: string): void { this._website.next(website); this.router.navigate([]); <-- This line here }

您是否可以在trueroute.navigate中使用guards或重定向?

答案 1 :(得分:1)

Angular 7.1使用 router.parseUrl()方法解决了此问题,该方法将路径名(在路由模块中设置)作为参数。

因此,您可以使用优美的router.navigate(['__'])来代替router.navigateByUrl('__')return router.parseUrl('____')(如果用作重定向,应该后面跟false return)。

我用尽了以前方法的许多变化,现在我计划严格按照角度保护逻辑组成的日历计划我的日子。

在每次我要检查日历时都不需要我回家的时候,这项新的parseUrl()升级大大改善了我的生活。

Nate Lapinski and the fantastic Angular In Depth的提示。

答案 2 :(得分:0)

它运行了几次,因为路由器有几个要处理的事件。您可以测试这是否是这样的最后一个事件。

this.router.events.subscribe(event => {
  if(event instanceof NavigationEnd) {
    // Last event, do your thing
  }
});

答案 3 :(得分:0)

不是多次执行canActivate,而是您订阅的事件。在您的情况下,它将是router事件。

您可以只查看NavigationEnd的最后一个事件,如@trichetriche在另一个答案中所述。