类的公共方法在TypeScript / Angular中不可见

时间:2019-02-06 07:22:29

标签: angular typescript oop

我有一个打字稿课,如下:

import { Injectable } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';

@Injectable()
export class RouteParamsService {
  public router : ActivatedRoute;

  constructor(){};

  public getRouteParams(){
      return this.router;
  }

}

我正在组件中使用它,如下所示:

import { ListItem } from "../../../shared/models/listItem.model";
    import { RouteParamsService } from '../../../shared/services/routeParams.service';

    export class CheckGroupsFilterValues {
        private route = new RouteParamsService();
        public rgr: string[] = []; //responsibilityGroups
        public sys: string[] = []; //systems
        public app: string[] = []; //applications
        public cgr: string[] = []; //checkGroups
        public cgi: string[] = []; //checkGroupInstances
        public nat: string; //needsAttentions

        constructor(){
            this.rgr = ["MULTI_MULTI_Vale_Sellout (4213)"];
            this.sys = ["MULTI_MULTI_Vale_Sellout (4213)"];
            this.app = ["MULTI_MULTI_Vale_Sellout (4213)"];
            this.cgr = ["MULTI_MULTI_Vale_Sellout (4213)"];
            this.cgi = ["MULTI_MULTI_Vale_Sellout (4213)"];

            console.log(this.route);
        }

    }

问题是:console.log(this.route)提供以下输出RouteParamsService {}。 即使我已经创建了一个实例,该类中定义的公共方法getRouteParams()也不可见。

2 个答案:

答案 0 :(得分:1)

这里有不止一件错误的事情。

1- router中的RouteParamsService将始终为undefined,因为它没有分配到任何地方。需要正确插入constructor中的in。

constructor(public router : ActivatedRoute){};

2- private route = new RouteParamsService();不会创建Angular服务。为了将ActivatedRoute注入服务的构造函数中,它要么必须是Angular服务(可注入),要么必须手动进行。因此,如果您使用new创建服务,则必须将ActivatedRoute手动传递给服务。

您可以使用Injectorhttps://angular.io/api/core/Injector)在您的自定义类中手动注入注射剂。

更新

要向定制类中注入Angular注入,可以使用Injector

首先,从功能模块中导出Injector的实例(以避免循环依赖),然后将功能模块导入您的应用程序模块中

export let InjectorInstance: Injector;

@NgModule(
 /* *** */
)
export class MyFeatureModule {
  constructor(private injector: Injector) {
    InjectorInstance = this.injector;
  }
}

-----

@NgModule(
     imports: [
       ...,
       MyFeatureModule,
       ...
     ]
)
export class AppModule {}

然后在您的自定义类中,从功能模块中导入InjectorInstance并使用它来获取可注入的引用:

import {InjectorInstance} from 'path/to/my-feature-module.module';

export class CheckGroupsFilterValues {
   private route = InjectorInstance.get<RouteParamsService>(RouteParamsService);
};

不要忘记在root

中提供服务
@Injectable({
  providedIn: 'root'
})
export class RouteParamsService {...}

答案 1 :(得分:1)

您需要使路由器通过构造函数

constructor(
    private _route: ActivatedRoute, // <-- Usefull
    private _router: Router,
  ){}

https://angular.io/guide/router