在我的应用程序的初始加载时,为什么ui-router状态未设置?

Nor*_*mac 13 angularjs angular-ui-router

当我去我的应用程序时https://localhost/my-app/resources/index.html,我有逻辑进入我自定义的默认状态.但是,当我想直接转到我的应用程序的特定部分(即https://localhost/my-app/resources/index.html#/orders/draft)时,状态未设置(模板也未加载到ui-view指令中).一旦初始加载完成(设置了默认状态),那么我可以直接在网址内容中添加内容.

我想我错过了一些关于如何在我的应用程序中加载内容的基本概念,但我希望状态会被设置,因为url是在 $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);
    }
});
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我从服务器获取导航对象,确定用户可以访问哪些ui-router状态.然后我所有定义的状态都被过滤到可用状态,这些是我用于导航ui的状态.

另外,"updatePrimaryState(...)包含对$ state.go(...)的调用

那么,为什么状态没有设置初始负载?如果这是预期的行为,那么将用户引导到指定的url的好方法是什么?

UPDATE

我创建了一个显示预期行为的plunker(http://plnkr.co/edit/m9gQLOZmqaAY88wSc6wC?p=preview).我试图复制我的问题,但在简单的情况下,它只是按预期工作.显然,我的结果有些不对劲,但我的设置与plunker中的设置非常相似.要测试我在我的应用程序中看到的场景,您需要:

  1. 在单独的窗口中启动plunker视图
  2. 验证状态已设置后,将链接复制并粘贴到新窗口中.
  3. 在这个新窗口中,应用程序应直接进入与URL匹配的状态.在plunker这是有效的,但在我的应用程序中,它没有.

加载我的应用程序后,加载的状态是名为""的空状态,其中包含URL"^".

更新2 在深入研究寻找差异的代码之后,我发现当广播角度为"$ locationChangeSuccess"时,ui-router中的监听器尚未初始化.我发现不同之处在于我们有一个单独的(可重复使用的)登录应用程序,最初是引导的,然后在成功登录后,引导实际的应用程序.在实际应用程序被引导时,$ locationChangeSuccess已经被广播,并且ui-router侦听器尚未初始化以捕获它.

我的想法是在我的应用程序被引导后重新播放该事件,但我仍然遇到时间问题,事件监听器似乎是最后一件事初始化.我首先将它添加到myApp.run()块,但广播仍在事先发生.将广播放入应用程序的主要指令的链接功能(ui-view所在的位置)可以正常工作,但不确定这是一个好方法.有没有更好的办法?

Nor*_*mac 2

我想我最好继续发布我的第二次更新作为解决方案,这适用于我的情况:

在深入研究代码寻找差异后,我发现当广播角度“$locationChangeSuccess”时,ui-router中的监听器尚未初始化。我发现区别在于我们有一个单独的(可重用的)登录应用程序,最初是引导的,然后在成功登录后引导实际的应用程序。在实际应用程序启动时, $locationChangeSuccess 已经被广播,并且 ui-router 侦听器尚未初始化以捕获它。

将广播放入应用程序的主指令的链接函数(ui-view 所在的位置)中是可行的,但不确定这是一个好方法。

希望有帮助。