在UI-router FAQ中,他们提出了一些方法来阻止基于data.rule
状态方法访问某些状态。假设当前用户由某个$currentUser
服务确定。
然而,在现实世界的用例中,这种假设似乎并非如此。因为通常这种$currentUser
服务的实现方式是它从服务器查询当前用户,并且可能返回的最佳服务是当前用户的 promise
。因此,在触发$stateChangeStart
事件时,此承诺很可能尚未解决。
考虑到上述讨论,那么最好的做法是什么呢?
一种解决方法可能是在每个安全状态中包含resolve
属性,并使用一个返回当前用户承诺的函数。但我真的不喜欢它,因为它有点打破了我心中的封装。
答案 0 :(得分:1)
这里的解决方案是推迟UI路由器执行 - 直到$currentUser
得到解决。该技术可以从内置功能中获益: deferIntercept(defer)
deferIntercept(defer)
禁用(或启用)延迟位置更改拦截。
如果您希望自定义同步URL的行为(例如,如果您希望延迟转换但保留当前URL),请在配置时调用此方法。然后,在运行时,在配置了自己的$ locationChangeSuccess事件处理程序之后调用$ urlRouter.listen()。
可以在这里找到并观察所有细节