以此示例状态定义:
.state('parent',
{
abstract:true,
url:'/parent',
controller:'Child1Controller'
templateUrl:'parent.html'
})
.state('parent.child1',
{
url:'/{data:[0-9]{1,8}}',
template:'child1.html'
})
.state('parent.child2',
{
url:'/:otherData',
template:'child2.html'
});
当网址为数字(例如/parent/1234
)时,会激活子级1,否则会激活子级2。
我希望每个子状态都有不同的控制器,例如Child1Controller
只应为chid1
状态实例化。我不想在每个子状态上设置控制器,因为当'/:data or
/:otherData`的值改变时,将为每个子控制器实例化相同的控制器。
我只需要在子状态之间切换时改变控制器。
我想使用controllerProvider
,但我看不到传递给它的任何数据,我可以用它来知道哪个孩子被激活了。
这可能或者我应该为第二个子状态定义新的父路由吗?
答案 0 :(得分:0)
修改强>
在您的评论之后,它变得更加清晰。虽然我确信可以通过重构(例如,缓存加载的数据,将处理函数移动到外部服务)来防止这个问题,因此子控制器实例化的频率无关紧要,还有另一种方法。
您可以将子状态包装在具有控制器属性的另一个父状态层中:
.state('customers', {
abstract: true,
url: '/customers',
templateUrl: 'customers.html'
})
.state('customers.child1wrap', {
abstract: true,
url: '',
controller: 'Child1Controller',
template: '<div ui-view></div>'
})
.state('customers.child1', {
url: url:'/{data:[0-9]{1,8}}',
templateUrl: 'child1.html'
})
.state('customers.child2wrap', {
abstract: true,
url: '',
controller: 'Child2Controller',
template: '<div ui-view></div>'
})
.state('customers.child2', {
url:'/:otherData',
templateUrl: 'child2.html'
})
这样,您可以更改child1
,child2
的网址参数,而无需重新实例化Child1Controller
,Child2Controller
。
原始回答
我不确定我是否正确理解您的设置,例如为什么要在Child1Controller
而不是parent
上定义customers.child1
。此外,如果您声明为parent
的{{1}},customers
的等级父级,则child1
不应被child2
调用?
无论如何,如果这些假设是正确的,这就是我组织这些状态的方式:
.state('customers', {
abstract: true,
url: '/customers',
templateUrl: 'customers.html'
})
.state('customers.child1', {
url: url:'/{data:[0-9]{1,8}}',
controller: 'Child1Controller',
templateUrl: 'child1.html'
})
.state('customers.child2', {
url:'/:otherData',
controller: 'Child2Controller',
templateUrl: 'child2.html'
})