控制器继承是AngularJS的一个好习惯吗?

时间:2014-07-06 11:09:48

标签: javascript angularjs inheritance angularjs-controller

我是AngularJS的新手,我不知道" 控制器继承是AngularJS的一个好习惯吗?"。我的意思是,如果我有两个几乎相同的控制器,如:

someModule.controller('SimilarController1', function($scope) {
    $scope.theSameFun1 = function() {
        // Some $scope manipulation
    };
    $scope.theSameFun2 = function() {
        // Some $scope manipulation
    };
    $scope.foo = function() {
        // Some $scope manipulation
    };
});

someModule.controller('SimilarController2', function($scope) {
    $scope.theSameFun1 = function() {
        // Some $scope manipulation
    };
    $scope.theSameFun2 = function() {
        // Some $scope manipulation
    };
    $scope.bar = function() {
        // Some $scope manipulation
    };
});

然后我可以这样写:

someModule.controller('BaseController', function($scope) {
    $scope.theSameFun1 = function() {
        // Some $scope manipulation
    };
    $scope.theSameFun2 = function() {
        // Some $scope manipulation
    };
});

someModule.controller('SimilarController1', function($scope, $controller) {
    $controller('BaseController', {$scope: $scope});
    $scope.foo = function() {
        // Some $scope manipulation
    };
});

someModule.controller('SimilarController2', function($scope, $controller) {
    $controller('BaseController', {$scope: $scope});
    $scope.bar = function() {
        // Some $scope manipulation
    };
});

那是" Angular方式"解决这类问题?

我已经读过重复的部件应该在服务/工厂。我还读到在服务/工厂中传递和操作$ scope是不好的做法,所以在这种情况下可能不是一个好主意。

2 个答案:

答案 0 :(得分:1)

这个答案并不是针对AngularJS的,但一般来说你应该更喜欢组合继承,其原因是如果你向基类添加新功能,那么它将被所有派生类型继承。首先,这听起来就像您需要的行为,直到您的某个派生类型需要稍微不同的行为,然后在您的派生类型中,您需要覆盖基本行为以获得您的专家行为。这样做一次是可以的(可能)但是有大量的多态类型管理并跟踪基本行为的用途以及具有专家覆盖的内容,然后确保当基本行为发生变化时专家变化同步变得痛苦

因此,如果我们更喜欢组合,那么如果我们设计每个类以便它接受具有一定大小的特定功能的预定义组件,那么我们可以通过更改它构建的组件来更改我们的一个实例中的特定行为。总的来说,这更符合最佳实践原则(SOLID)等。

并将其带回AngularJS,Angular通过其依赖注入方案来创建服务,然后将它们注入控制器和其他服务,从而鼓励这一点。因此,这样做的角度方式是构建一个服务,该服务封装了每个控制器共享的功能,然后将该服务注入到需要它的每个控制器中。您可能会想到,而不是让一个单片服务完成控制器可能需要的所有操作,而是构建更小的服务,只提供一组特定的相关功能,这只是坚持关注点分离原则。这种更细粒度的服务模式意味着每个控制器最终只能获得所需的服务,并且重新使用服务的决策更加容易。

答案 1 :(得分:1)

继承是一个OOP概念,Angular是一个javascript框架,这些是不同的概念,您应该使用OOP来参数化您的代码,您应该使用angular来防止自己编写自定义DOM查询,这与MVVW框架相比是一种过度杀伤力。考虑Angular 2.0它使用的ES6类具有完整的OOP概念。所以我对你的问题的回答可以随意使用OOP和angular,学习Angular 2.0并尝试在Angular 1.0中使用它的概念......

顺便说一下,为了您的利益,请考虑以下问题:angularjs with oop inheritance in action