我使用Angular 5并定义了几条路线。当我在canActivate函数保护中导航路径并设置断点时,我看到它被执行了两次。
我问这个是因为我必须在每次canActivate调用上调用外部服务,并且多次无用地执行相同的服务会导致不必要的开销。
答案 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
}
。
您是否可以在true
或route.navigate
中使用guards
或重定向?
答案 1 :(得分:1)
Angular 7.1使用 router.parseUrl()方法解决了此问题,该方法将路径名(在路由模块中设置)作为参数。
因此,您可以使用优美的router.navigate(['__'])
来代替router.navigateByUrl('__')
或return router.parseUrl('____')
(如果用作重定向,应该后面跟false return)。
我用尽了以前方法的许多变化,现在我计划严格按照角度保护逻辑组成的日历计划我的日子。
在每次我要检查日历时都不需要我回家的时候,这项新的parseUrl()升级大大改善了我的生活。
答案 2 :(得分:0)
它运行了几次,因为路由器有几个要处理的事件。您可以测试这是否是这样的最后一个事件。
this.router.events.subscribe(event => {
if(event instanceof NavigationEnd) {
// Last event, do your thing
}
});
答案 3 :(得分:0)
不是多次执行canActivate
,而是您订阅的事件。在您的情况下,它将是router
事件。
您可以只查看NavigationEnd
的最后一个事件,如@trichetriche在另一个答案中所述。