AngularJS扩展控制器

时间:2013-12-23 20:34:39

标签: javascript angularjs

我使用角度来构建一个大应用程序,我有一些常用的控制器方法实际上我这样做,但有一个最好的方法吗?

app.controller('baseController', function($scope, $controller, appFactory) {
    var $scope.foo = function() {
        // Do something
    }
});


app.controller('childController', function($scope, $controller, appFactory) {

    // Here i extend or something like, the base controller

    $controller('baseController', {$scope: $scope});

    var $scope.bar = function() {
        // Do a lot of things an then call foo
        $scope.foo();
    }
}):

我这样做是因为这种方法需要具有我控制器的de $范围。

2 个答案:

答案 0 :(得分:3)

我不同意上述注释,不应该为控制器实现继承。在许多情况下,即使您使用共享服务/工厂/提供商,控制器继承也会使您的代码保持DRY。使用@ Clever的答案示例,如果您可以将其放入单个基本控制器中,为什么要在X个控制器中重复$scope.foo = function() { MyFactory.calculateFoo(); }。这并没有使控制器变胖,而是将其清理干净并保持干燥。

Misko自己在AngularJS google小组中给出了example一个可能的控制器继承实现。我个人自己使用这个方法,简单的例子,从我的孩子控制器中调用:

$injector.invoke(MyBaseController, this, { $scope: $scope, alertService: alertService });

我使用控制器继承的一个示例,对于我的大多数CRUD页面,我有一个实现通用create / update $ scope函数的父控制器。此基本控制器获取注入的存储库服务,用于执行实际的服务器调用等。为什么要反复对所有CRUD页面重复此操作?

答案 1 :(得分:1)

详细说明KayakDave所说的,Angular控制器通常是轻量级的。如果您发现自己在控制器中思考“继承”,那么您可能做错了。最好将控制器之间共享的公共逻辑提取到Service/Factory/Provider。例如:

app.Factory('MyFactory', function() {
    return {
        calculateFoo: function() { 
          // stuff 
        }
    };

});

app.controller('FirstCtrl', function($scope, $controller, MyFactory) {
    var $scope.foo = function() {
        MyFactory.calculateFoo();
    }
});


app.controller('SecondCtrl', function($scope, $controller, MyFactory) {

    var $scope.bar = function() {
        MyFactory.calculateFoo();
    }
}):