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

时间:2014-05-16 19:03:41

标签: angularjs angular-ui-router

当我在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中的设置非常相似。要测试我在我的应用中看到的情景,您需要:

  1. 在单独的窗口中启动plunker视图
  2. 验证状态已设置后,将链接复制并粘贴到新窗口中。
  3. 在这个新窗口中,应用应该直接进入与网址匹配的状态。在plunker中这是有效的,但在我的应用程序中,它没有。
  4. 加载我的应用后,加载的状态为空状态,名为:""与网址" ^"。

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

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

2 个答案:

答案 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所在的位置)有效,但不确定这是一个好方法。

希望有所帮助。