在抽象状态上使用controllerProvider

时间:2014-01-15 14:13:36

标签: angularjs angular-ui-router

以此示例状态定义:

.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,但我看不到传递给它的任何数据,我可以用它来知道哪个孩子被激活了。

这可能或者我应该为第二个子状态定义新的父路由吗?

1 个答案:

答案 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'
})

这样,您可以更改child1child2的网址参数,而无需重新实例化Child1ControllerChild2Controller

原始回答

我不确定我是否正确理解您的设置,例如为什么要在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'
})