为什么你可以在AngularJS中的路线上定义一个控制器?

时间:2016-08-01 11:53:15

标签: javascript angularjs

抛开指令,我们可以并且通常在视图中间的某处分配控制器,只是为了修改具有某种状态或行为的特定部分HTML。您可以在任何级别执行此操作,甚至是最高级别。视图和控制器紧密耦合在一起。

您可以在路由级别分配控制器的原因是什么?我从来没有理解过这个,这背后的哲学是什么?将控制器分配给视图之外而不是视图本身的顶部有什么额外的好处。当然不能为另一个实现切换控制器;我从来没有见过这样做过。

/ edit:也许有必要为了手动解决注入? (见John Papa's example

1 个答案:

答案 0 :(得分:1)

我确定有其他正当理由可以选择为路线定义控制器,但我认为这是一个相当大的原因。想想这种情况:

  • 您有一个模板,您希望重复使用各种路线/状态
  • 您可能希望根据路线为模板分配不同的控制器。

如果您在模板中使用ng-controller,则无法(据我所知)将该模板与其他控制器重复使用。

通过路线分配控制器,您可以获得更大的灵活性。

标准方法

我将在此示例中使用UI.Router,因为这是我所有的经验。

.state( 'users', {
    templateUrl: 'person.html'
    controller: 'UsersController'
})

.state( 'admin', {
    templateUrl: 'person.html'
    controller: 'AdminController'
})

相同的模板,不同的路线,不同的控制器。

动态方法

  

肯定不能为另一个实现切换控制器

我不会争论这个用例的优点/缺点,但我自己曾经使用过一两次,而且我已经在SO和其他博客上看到了它的讨论。

.state( 'entity', {
    templateUrl: 'person.html'
    controller: function( ...injectables ){
        var UserController = function(){ ... }
        var AdminController = function(){ ... }

        var ControllerClass = isAdmin ? AdminController : UserController;
        return new ControllerClass()           
    }
})