在AngularJS应用程序的控制器超类中加载依赖项的正确方法是什么?

Bob*_*nas 5 javascript angularjs typescript

我正在构建一个提供基本CRUD功能的AngularJS应用程序.该应用程序是使用TypeScript构建的,以利用类型和类.我有一个基本控制器,需要访问几个AngularJS依赖项.最初,我按如下方式注入了依赖项

文件:base-controller.ts

class BaseController {
    private $location;
    private $routeParams;
    constructor($location, $routeParams) {
        /* Manually inject dependencies */
        this.$location = $injector.get('$location');
        this.$routeParams = $injector.get('$routeParams ');
    }
}
Run Code Online (Sandbox Code Playgroud)

文件:list-controller.ts

class WorkRequestListController extends BaseController {
    /* Write code to override base controller or implement local methods */
}

angular.module('app.workRequests')
    .controller('WorkRequestListController', ['$location', '$routeParams',
        ($location, $routeParams) => new WorkRequestListController($location, $routeParams)
]);
Run Code Online (Sandbox Code Playgroud)

这个解决方案有效,但要求我的子类知道我的基类所需的依赖项.如果我在基类中需要另一个依赖项,我将不得不更改每个子类和实例化控制器的语句.为了解决这些问题,我现在只需将$ injector传递给我的基类,如下所示:

文件:base-controller.ts

class BaseController {
    private $location;
    private $routeParams;
    constructor($injector) {
        /* Load dependencies */
        this.$location = $injector.get('$location');
        this.$routeParams = $injector.get('$routeParams');
    }
}
Run Code Online (Sandbox Code Playgroud)

文件:list-controller.ts

class WorkRequestListController extends BaseController {
    /* Write code to override base controller or implement local methods */
}

angular.module('app.workRequests')
    .controller('WorkRequestListController', ['$injector',
        ($injector) => new WorkRequestListController($injector)
]);
Run Code Online (Sandbox Code Playgroud)

这是我的问题:这是在超类中加载依赖关系而不强制子类或其他代码知道依赖关系的正确方法吗?

bas*_*rat 2

这是在超类中加载依赖项而不强制子类或其他代码了解依赖项的正确方法吗?

这是一个办法。Angular 不建议在控制器中继承。它更喜欢组合。通用功能应该放在注入控制器的服务/工厂中。