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

Is controller inheritance a good practice in AngularJS?

本文关键字:一个 好习惯 继承 AngularJS 控制器      更新时间:2023-09-26

我是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方式"吗?

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

这个答案并不是AngularJS特有的,但一般来说,你应该更喜欢组合而不是继承,这样做的原因是,如果你向基类添加了新的功能,那么它就会被所有的派生类型继承。起初,这听起来只是你需要的行为,直到你的一个派生类型需要稍微不同的行为,然后在你的派生类型中,你需要覆盖基本行为来获得你的专门行为。这样做一次是可以的(也许),但与大量的多态类型管理和跟踪什么使用基本行为,什么有专家覆盖,然后确保当基本行为改变时,专家同步改变只是成为一个痛苦。

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

回到AngularJS, Angular通过它的依赖注入方案来鼓励它——创建服务,然后把它们注入到控制器和其他服务中。因此,angular的做法是构建一个服务,它封装了每个控制器共享的功能,然后将该服务注入需要它的每个控制器。您可能会认为,与其使用一个单一的服务来完成控制器可能需要的所有功能,不如构建更小的服务,只提供一组特定的相关功能——这只是遵循了关注点分离原则。这种更细粒度的服务模式意味着每个控制器最终只使用它需要的服务,并且更容易做出重用服务的决定。

继承是一个面向对象的概念,Angular是一个javascript框架,这些是不同的概念,你应该使用OOP来参数化你的代码,你应该使用Angular来防止你自己编写自定义DOM查询,这与MVVW框架相比是多余的。考虑一下Angular 2.0,它使用了带有完整OOP概念的ES6类。所以我对你的问题的回答是,随意使用angular的OOP,学习angular 2.0并尝试在angular 1.0中使用它的概念…

顺便说一句,为了你的利益考虑以下问题: