在初始化路由之前发送$http请求?

4
我有一个$rootScope.$on("$stateChangeStart")事件,它会更改标题描述
我必须在我的event中使用一个$rootScope对象,在$http请求后创建。问题是,当$stateChangeStart事件运行时,我的object未定义。

我尝试在我的ui-router状态上使用resolve。但它只适用于控制器,而不是event

你能帮我想出一个解决方案吗,它将在路由开始之前运行我的服务(带有$http请求),并且在状态更改后不再运行此服务。


你需要创建一个提供者并在配置阶段内运行它,将其存储到提供者变量中,并使用该提供者变量代替$rootScope。 - Pankaj Parkar
请添加一个 Plunker,这样我们就可以帮助你了。 - lin
1
在提供程序中无法使用 $http。当提供程序运行时,服务不可用。 - ribsies
1个回答

2

我决定尝试使用一个promise来解决这个问题:

$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams){

    if ($rootScope.myObj) { // if my "object" was already created
        eventLogic();
    } else {
        getMyObj.init().then(function(res){ //call service that retuns a promise
            eventLogic();
        });
    }

    function eventLogic() {
        ...
    }
}

这个解决方案完全解决了我的问题。它等待$rootScope.myObj被创建,然后只运行一次此服务。

1
请查看 http://angular-ui.github.io/ui-router/site/#/api/ui.router.router.$urlRouterProvider ,特别是 $urlRouterProvier.deferIntercept() 函数。您可以通过调用该函数推迟路由,直到您准备好为止。然后在准备就绪时调用 $urlRouter.listen(),路由将开始。 - Chris T
很遗憾,$urlRouter.listen()不能重新加载当前状态。 - M K
$urlRouter.listen() 之后添加 $urlRouter.sync() - M K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接