当我进入子状态时,我想在根状态中隐藏象限ui-view的ui-view组件。怎么能实现这一点。
##index.html
<div ui-view="a">
</div>
<div ui-view="b">
</div>
<div ui-view="c">
</div>
##b.html
<div ui-view>
</div>
##config
$stateProvider.state('start', {
'views': {
'a': {
templateUrl: ...
},
'b': {
templateUrl: 'b.html'
},
'c': {
templateUrl: ...
}
},
controller: 'indexController
}).state('start.all', {
templateUrl: 'd.html',
controller: 'allController'
});
所以当我到达start.all时,我希望ui-view标记的c消失。我怎样才能做到这一点。
答案 0 :(得分:2)
下面讨论了an example演示方法。我要说的是ui-router
的本地方式是管理当前(活动)状态的所有视图。我们可以用:
...在幕后,为每个视图分配一个遵循
viewname@statename
方案的绝对名称,其中viewname是视图指令中使用的名称,状态名称是州的绝对名称,例如 contact.item
在我们的例子中,视图的全名&#39; c&#39;将c@
,即c
作为视图名称,@
作为分隔符,空字符串表示根(有点奇怪但实际上是逻辑的)。
我们可以像这样更改start.all定义:
.state('start.all', {
url : '/all',
'views': {
'': {
template: '<span>this is start ALL</span>',
},
'c@': {
template: '<span></span>',
},
},
})
我们将更改根目录中c
视图的内容。这应该是ui-router
最本土的方式。它没有有效地删除它,但我们可以用一些空的东西替换它。
此外,在上面的示例中,我将名为bController
的控制器放置为indexController
的对比示例:
.state('start', {
url : '/start',
'views': {
'a': {
template: ...
},
'b': {
template: ...
// HERE a new controller bController
controller: 'bController',
},
'c': {
template: ...
}
},
// the orginal contoller
controller: 'indexController',
})
并以这种方式定义它们:
.controller('indexController', function($scope, $state, $stateParams) {
console.log('indexConroller was invoked');
})
.controller('bController', function($scope, $state, $stateParams) {
console.log('bConroller was invoked');
})
为什么呢?为了告诉你,永远不会调用indexController
。控制器属于模板/视图而不是... ...
一起检查所有here
答案 1 :(得分:0)
你可以通过几种方式实现这一目标。一种方法是使用包含视图a
和b
的抽象状态。然后,该抽象状态具有两个具体的子状态:start
,其中添加了视图c
,而all
则添加了视图d
。
另一个选择是在c视图的根元素上使用ng-show
指令绑定到某个范围变量。我会选择第一个选项。
值得注意的是,这不会回答这个问题,因为all
不再是start
的孩子。如果all
确实需要继承start
(目前似乎没有必要),您只需将start
抽象为start.main
并{ {1}}。
虽然Radim的解决方案非常聪明且非常受欢迎,但我认为这比使用空模板覆盖父视图更具可读性和直观性。
start.all