更改ui视图指令处理页面转换的方式



编辑:不要这样做除非你想花几个小时调试,否则这是浪费时间,事实证明这比我最初想象的要复杂得多。目前的解决方案是:

  • 将加载的资源从解析器移到控制器中
  • 删除所有由ui路由器处理的回车动画
  • 添加您自己的动画init,并使用ng class将类输入到主作用域中
  • 使用页面特定控制器中的$scope.$emit来告诉主控制器何时完成加载

简言之,如果你需要这个(我在ui路由器问题跟踪器上看到了一些问题),不要使用解析器或ng animate来输入动画。您也不能在$stateChangeStart事件和离开动画上执行此操作,因为这与ui路由器的工作方式相冲突。

以下是我最初的问题。


我有一个特定的用例,我需要页面转换,并解决以特定顺序发生的问题,目前它们是这样发生的:

resolve > animate out > animate in

我更需要这样:

animate out > resolve > animate in

我决定检查一下ui路由器的源代码,看看它为什么会这样。幸运的是,这是一个非常简单的mod。在ui视图指令中,我们有这样的代码。

scope.$on('$stateChangeSuccess', function() {
    updateView(false); // cleanupLastView(); is at the end of this function
});
scope.$on('$viewContentLoading', function() {
    updateView(false); // cleanupLastView(); is at the end of this function
});

我需要将其更新为:

scope.$on('$stateChangeStart', function() {
    cleanupLastView();
});
scope.$on('$stateChangeSuccess', function() {
    updateView(false); // remove cleanupLastView();
});
scope.$on('$viewContentLoading', function() {
    updateView(false); // remove cleanupLastView();
});

问题是,出于显而易见的原因,我不想去破解核心。有没有什么方法可以"取消注册"ui-routerui-view指令,并告诉它使用我的指令?

所以我实际上写下了这个问题,然后找到了答案。为其他人在网上旅行时发布。

答案是复制BOTHui视图指令,然后简单地添加一个名为(例如)rich97-view的新指令。然后,您可以在视图中使用它,就像使用ui视图一样。这种方法的伟大之处在于,mod只适用于您需要的地方,默认行为不变。

最新更新