向控制器注入服务

时间:2015-12-07 05:38:32

标签: angularjs typescript

我有一个带有constructor()和方法的Controller类。

static $inject = ['$stateParams', '$location', 'defectResource', 'entityProvider'];

constructor($stateParams: any, $location: any, defectResource: any, entityProvider: any) {
    if (typeof $stateParams.defectid != 'undefined') {
        this.defectid = $stateParams.defectid;


        defectResource.defectByDefectId(this.defectid).then((data) => {
                this.defect = data;
        });

     } else {

        // create new Defect
        this.defect = entityProvider.newDefect($stateParams.itemid);
     }
}

postDefect($stateParams: any, $location: any, defectResource: any): void {
    defectResource.postDefect(this.defect).then(function () {
        $location.path('defects/' + $stateParams.itemid);
    });
};

此代码正常,但我没有在构造函数中使用$location。它仅用于postDefect() mtehod。但我无法从构造函数参数中删除它,因为构造函数参数列表必须与$inject列表相同。

有没有办法不将$location传递给构造函数?

2 个答案:

答案 0 :(得分:2)

您可以在postDefect()中跳过它,然后使用此。$ location代替。

你不应该在所有地方使用'any',从https://github.com/DefinitelyTyped/DefinitelyTyped获取所需的DefinitelyTyped文件 并将它们包含在您的项目中。

答案 1 :(得分:1)

  

但我无法从构造函数参数中删除它,因为构造函数参数列表必须与$ inject列表相同。有没有办法不将$ location传递给构造函数?

如果类需要它(因为函数需要它)...最好将它作为构造函数中的依赖项预先存在。

只是一件小事......使用public将其存储在课堂中,例如:

constructor($stateParams: any, public $location: any, defectResource: any, entityProvider: any)
  

有没有办法不将$ location传递给构造函数?

在构造函数中获取$injector而不是$location,然后在实际需要时调用$injector.get('$location')。警告:这会让您的代码更难以审核下一个人¯\_(ツ)_/¯