当我在https://localhost/my-app/resources/index.html
转到我的应用时,我有逻辑进入我自定义的默认状态。但是,当我想直接转到我的应用程序的特定部分(即https://localhost/my-app/resources/index.html#/orders/draft
)时,状态未设置(模板也未加载到ui-view指令中)。一旦完成初始加载(设置了默认状态),那么我就可以直接在网址内添加网址。
我认为我在我的应用中如何加载内容时缺少一些基本概念,但我希望状态会因为$location.url()
我的代码片段,用于处理初始加载时的状态:
$http.get("Navigation").then(function(response){
var navigationObjects = response.data,
directUrl = $location.url(),
stateName = null;
scope.availableStates = ims360RouterStateService.getAvailableStates(navigationObjects);
if (!directUrl)
{
scope.updatePrimaryState(scope.availableStates[0]);
}
else
{
//TODO there's probably a better way to do this
//parsing out the state name, requires that the state name matches the url, this fails when I have a place holder (such as an id to a resource)
stateName = directUrl.substring(1).replace(/\//g, ".");
$state.go(stateName);
}
});
在这段代码中,我从服务器获取导航对象,确定用户有权访问哪些ui-router状态。然后我所有定义的状态都被过滤到可用状态,这是我用于导航ui的内容。
此外," updatePrimaryState(...)包括对$ state.go(...)的调用
那么,为什么状态没有设置为初始加载?如果这是预期的行为,那么将用户引导到指定的网址的好方法是什么?
更新
我创建了一个显示预期行为(http://plnkr.co/edit/m9gQLOZmqaAY88wSc6wC?p=preview)的plunker。我试图复制我的问题,但在简单的情况下,它只是按预期工作。显然,我的结果有些不对劲,但我的设置与plunker中的设置非常相似。要测试我在我的应用中看到的情景,您需要:
加载我的应用后,加载的状态为空状态,名为:""与网址" ^"。
更新2 在深入研究代码寻找差异之后,我发现当角度" $ locationChangeSuccess"广播时,ui-router中的监听器尚未初始化。我发现不同之处在于我们有一个单独的(可重复使用的)登录应用程序,它最初是自动引导的,然后在成功登录后,引导实际的应用程序。在实际应用程序被引导时,$ locationChangeSuccess已经被广播,并且ui-router监听器尚未被初始化以捕获它。
我的想法是在我的应用程序启动后重播该事件,但我仍然遇到时间问题,事件监听器似乎是最后一件事初始化。我首先将它添加到myApp.run()块,但广播仍在事先发生。将广播放入应用程序的主要指令的链接功能(ui-view所在的位置)有效,但不确定这是一个好方法。还有更好的方法吗?
答案 0 :(得分:4)
我刚发现这个http://niclassahlin.com/2014/05/31/kickstarting-angular-ui-router/,它对我来说就像魅力一样。
使用app.js中的下一个代码,您可以实现初始状态:
app.run(['$state', function ($state) {}])
答案 1 :(得分:2)
我认为我最好继续发布我的第二次更新作为解决方案,这是针对我的情况:
在深入研究寻找差异的代码后,我发现当广播角度为“$ locationChangeSuccess”时,ui-router中的监听器尚未初始化。我发现不同之处在于我们有一个单独的(可重用的)登录应用程序,最初是引导的,然后在成功登录后,引导实际的应用程序。在实际应用程序被引导时,$ locationChangeSuccess已经被广播,并且ui-router侦听器尚未初始化以捕获它。
将广播放入应用程序的主要指令的链接功能(ui-view所在的位置)有效,但不确定这是一个好方法。
希望有所帮助。