我目前正在遇到UI路由器如何处理加载其解析的顺序的问题。我试图完成的最终目标是提供加载数据并存储数据的服务,并将数据加载(请求)一次,然后通过服务访问。
目前我实施它的方式遵循这种模式:
在更高级别的状态解析中,告诉服务加载其数据。解析的结果不是子服务的依赖性,因为通过在控制器中注入服务来访问数据。 子状态结算可能取决于已经启动的服务"在以前的状态 当您通常点击应用程序时(例如,状态a - >状态ab - >状态abc),当您直接进入嵌套状态(状态ab或状态abc)时,它会崩溃。出现此问题的原因是,如果子状态未指定父状态的解析作为依赖关系,则UI路由器将无法确保执行顺序解析。请参阅以下示例:
app.config(function($stateProvider) {
$stateProvider
.state('a', {
url: "/a",
resolve: {
data: function(service) {
return service.getData(); // makes network request
}
}
})
.state('a.b', {
url :"/b",
resolve: {
specificData: function(service) { // if you add data as a dependency here, it works fine
return service.useDataToGetSpecificData(); // doesn't make network request
}
}
})
});
在该示例中,如果用户直接进入状态a.b,则specificData resolve将失败。 service.useDataToGetSpecificData不发出网络请求并访问当前存储在服务中的数据。此调用失败,因为状态a的解析尚未完成,因为它是网络请求。
解决方案是让服务处理它尚未拥有数据的情况,并通过等待它有数据来管理它,但是对于服务将要做什么感觉有点过分了,似乎打败UI路由器。
另一个解决方案(我目前正在使用的)是添加"数据"作为状态a.b中的决心的依赖性,即使它没有被使用。这迫使a.b等待a完成它的结算,一切都很好。然而,这感觉就像一个黑客,非常不直观。任何在不知情的情况下查看此代码的人都会为了解决为什么在a.b的解析中声明这个未使用的变量而感到头疼。
如果没有指定依赖关系就无法保证解析的顺序是UI路由器的行为方式,所以我觉得我必须做一些奇怪/错误的事情。
答案 0 :(得分:1)
另一个解决方案(我目前正在使用)是将“数据”添加为状态a.b中的解析依赖项,即使它未被使用。这迫使a.b等待a完成它的结算,一切都很好。然而,这感觉就像一个黑客,非常不直观
这是常见的方式。我通常这样做是为了向一条路线添加多个顺序解析。例如,我经常添加一个attachUser
挂钩,它从HTTP GET请求返回一个promise,然后添加另一个{em> attachUser 作为依赖项的isLoggedIn
。我搜索了很多,从未发现过更好的东西。在ui-router中,除了angular的注入器之外,没有什么特别的。即使您的案例由于继承而特殊,这与here和here完全相同。
所以我觉得我必须做一些奇怪/错误的事情。
你不是。它很可能被认为是奇怪/错误