AngularJs ui-router子视图消失

时间:2016-06-30 10:00:54

标签: angularjs angular-ui-router

这是一个Plunker https://plnkr.co/edit/CrLukiNbYRL8AreLS2rt?p=preview

请点击A,然后在B和C出现后 ,再次点击A. C将消失。

我有路线:

A - 摘要,它有2个命名视图A-1,A-2和一个主菜单。 B - 是一个子菜单,位于A-1 @ A视图中 C - 是与B菜单相关的内容,它位于A-2 @ A视图

路线A中的主菜单具有到B路线的ui-sref。

B路由控制器具有逻辑:

if($state.is('B')) {
    $state.go('C', {defaultContentId});
}

因此,当我单击主菜单元素时,它会打开B,其中包含默认内容。这没关系,没问题。但是,如果我在主菜单中单击相同的元素,则会选择我的默认子菜单,并且我的内容为空。 B控制器中的任何断点都没有被触发。

替代方法(不回答)

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
    if(!$state.is(toState.name, toParams) && $state.includes(toState.name, toParams)){
        event.preventDefault();
        console.warn('Same state prevented');
    }
});

我只有2层导航,所以我可以检查父母是否点击并阻止点击。不是解决方案,只是一个可疑的补丁...

因此。在我的例子中,我只有一个根,但在一个真实的例子中,我有......让我们假设 - A1,A2,A3 e.t.c.所以现在通过这种解决方法,我可以单击A1,但是如果加载B并且我单击A1,则会阻止它。我仍然可以自由地从A1转移到A2和A3 - > B层。

1 个答案:

答案 0 :(得分:2)

A.B.C是来自A.B.的子状态,因此不会重新执行A.B的控制器。因此,从A.B.C到A.B不会改变状态树中的第二级。

这对ui-router来说很酷,它可以保持状态加载,并且只能重新加载ui的某些部分。

如果您想在导航状态时实际重新执行,可以使用ui-sref-opts属性指定完整重新加载:

<menuItem ui-sref="A.B" ui-sref-opts="{reload: true}" class="btn btn--main">A - Click-me</menuItem>