2014-10-05 123 views
0

我知道子状态/控制器可以通过向其状态描述对象中的解析对象添加一个承诺对象来等待所需的异步结果。但是使用它意味着在控制器运行之前决定了状态所需的内容。在我的情况下,我需要应用逻辑来决定是否需要任何异步数据以及这些数据应该是什么。 我也明白,我可以把这个逻辑放在一个服务中,但这意味着将所有的逻辑从控制器移到相应的服务[这是一个选项,但感觉“错误”]。角状UI路由器在子状态控制器执行之前暂停

在我的场景中,我希望父状态能够推迟执行流程,并且不让他的子状态控制器执行,直到完成为它们准备一些内容为止。

只有当子状态本身没有自己的子状态时,才在子范围上设置一个承诺并等待它。[因为在这种模式下子控制器执行并且执行将继续到它的继承人国家,我再次需要添加一个承诺,让他们在解决承诺时实际运行他们的代码]。

我也知道我可能会赶上下一个StateChangeStarted事件,设置event.preventDefault=true并在以后使用$urlRouter.sync()它承诺对父状态的决心。但这样做感觉很尴尬。

我希望能够做一些类似$urlRouter.pause() [在编写Q时没有这样的API]以防止路由器继续,然后能够呼叫$urlRouter.sync()

什么是“有条不紊”的方式来有条件地暂停子状态控制器的执行,直到一些异步结果被父状态解决为止?

+0

FYI,这听起来酷似用于链解决了工作。父解析的结果可以注入到子解析中(一旦父解析完成)。你的控制器在做什么逻辑不适合分解? – 2014-10-06 21:07:46

回答

0

由于我写了这个Q,我采用了一种观点,认为父状态阻止子状态的执行不是一个好主意。

原因是,即使看起来父状态似乎知道子状态必须有一些数据为它准备好,因此它可以做它的东西,但至少有可能有其他的东西,子状态可以直到所需的数据变得可用。

我最好的例子是准备要在地图上显示数据的父状态 - 即使很明显子状态只有在父数据有数据时才能完成呈现 - 它肯定会开始呈现空的地图,只有当地图上的数据可用时才会添加数据。

从这个角度看,既不解决也不阻止子状态的执行是一个好主意。

到目前为止,我做了一个承诺服务,该承诺服务使父级创建的数据对$ scope保持承诺,并使用$q.all($promisService.get(),...).then$promisService.get().then作为适合每种特定情况的承诺。

这就是说,我正试图将承诺附加到状态$ data属性,以便他们自动清理。这只是我无法找到足够的信息。数据属性的行为或应该在动态上下文中使用

0

如果您需要使用来自父状态的子状态中的数据,我建议您在父状态控制器中设置$rootScope级别的数据,并且在子女状态下,您可以观看$rootScope并使用$rootScope中的数据填充本地范围。

例如,在父控制器:

$rootScope.user = User.get();

在孩子控制器:

$scope.userData = {..}; 

$rootScope.$watch('user', function(){ 
    //if somehow you need a local userData variable augmented with other types of data 
    $scope.userData.email = $rootScope.user.email; 
});