当服务注入父控制器时,我也应该注入子节点或者只是继承服务

时间:2014-07-27 08:06:58

标签: angularjs typescript

我试图了解在父控制器和子控制器以及父和子HTML中使用服务时如何将服务引入控制器。我是否应该将服务带入父服务器,然后从子服务器的范围获取该服务的副本,如下所示:

class AppController {
    static $inject = [
        '$scope',
        'configService'
    ]
    constructor(
        public $scope: IAppControllerScope,
        public config: IConfigService
        ) { 
        $scope.app = this;
        $scope.config = config;
    }
    // this.config is used here
} 
class AdminHomeController { 
    public app: AppController;
    public config: ConfigService;
    static $inject = [
        '$scope'
    ];
    constructor(
        private $scope: IAdminHomeControllerScope
        ) {  
        this.app = $scope.app;
        this.config = $scope.config;
        $scope.home = this;
    }
    // this.config is used here
}

或者我应该将服务带到父控制器和子控制器中,如下所示:

class AppController {
    static $inject = [
        '$scope',
        'configService'
    ]
    constructor(
        public $scope: IAppControllerScope,
        public config: IConfigService
        ) {
        $scope.app = this;
        $scope.config = config;
    }
    // this.config is used here
} 
class AdminHomeController {
    public app: AppController;
    static $inject = [
        '$scope',
        'configService'
    ];
    constructor(
        public $scope: IAdminHomeControllerScope,
        public config: IConfigService
        ) {
        this.app = $scope.app;
        $scope.home = this;
    }
    // this.config is used here
}

我将不胜感激任何建议和建议,这是最好的方法,如果有差异。还有一个问题。我的构造函数上的参数应该声明为private还是public?

1 个答案:

答案 0 :(得分:2)

这是你的选择,但是你喜欢这样做,但直接将它包含在每个控制器中的一个理由就是你对其他任何东西都没有依赖。

AppController包含并继承的问题是,如果由于某种原因,一个开发人员决定“我们不再在这里跪下”,那么你将拥有所有其他控制器服务有休息。 - @basarat告诉我,TypeScript实际上根本无法编译,但这显然仍然是一个问题,而不是没有。在这种情况下,你要么必须把它放回去,要么进入每个给出编译错误的控制器并将其注入它们中,所以你最终还是会回到第一个解决方案。

通过将其直接包含在每个控制器中,如果从其中一个控制器中删除它,则对应用程序的其余部分没有任何影响。它只是让事情变得更安全。

如果您真的想要只包含一次并在任何地方使用它,那么当应用程序运行时,您应该能够使用角度run方法将其注入rootScope。您可以执行以下操作。

myApp.run(function($rootScope, myService) {
  $rootScope.myService = myService;
})
// For declaring that myService exists on all instances of $scope: 
module ng{
    export interface IScope{
         myService: MyService;
    }
}