数组返回为未定义-依赖注入?角度/打字稿

时间:2018-09-20 12:17:31

标签: javascript arrays typescript

我分配从端点接收的数组数据。

我尝试在另一个文件中调用此数组,但它不喜欢它! 我的subscriberNames阵列控制台正确。

我的第一个文件:

export class EngagementService {
    public orgSubSidNames = [];


    let subsidiaryNames = []
    data.forEach(sub => {
        console.log(sub.SubsidiaryName)
        subsidiaryNames.push(sub.SubsidiaryName)
    })
    subsidiaryNames = subsidiaryNames.filter(this.onlyUnique);
    console.log('subsidiary name array' + subsidiaryNames)
    this.orgSubSidNames = subsidiaryNames;

    // This is just a sample script. Paste your real code (javascript or HTML) here.

    if ('this_is' == /an_example/) {
        of_beautifier();
    } else {
        var a = b ? (c % d) : e[f];
    }

第二个文件:

export class EngagementFilterComponent implements OnInit {
    public subSidNameArray: EngagementService;


    updateSub(data) {
        console.log(data);
        console.log('attempting to print the subsid array' + this.subSidNameArray.orgSubSidNames)
    }

我得到了错误:

 Cannot read property 'orgSubSidNames' of undefined

3 个答案:

答案 0 :(得分:2)

您永远不会设置属性public subSidNameArray: EngagementService;

的值

答案 1 :(得分:1)

在创建EngagementFilterComponent

的代码中
const filter = new EngagementFilterComponent()
filter.subSidNameArray = new EngagementService()

或在构造函数中设置

public subSidNameArray: EngagementService = new EngagementService()

或使用注射

如果您的框架使用注入,请确保您的接收组件使用适当的构造函数。 constructor(private engagementService: EngagementService)

说明

 public subSidNameArray: EngagementService

声明您的类包含EngagementService的实例。您尚未创建一个。必须使用new关键字创建该类的实例。 :EngagementService部分是typescript,用于声明subSidNameArray的类型,这是普通javascript中找不到的功能。但是它不会创建实例。

答案 2 :(得分:1)

subSidNameArray需要在某个地方初始化,而不仅仅是声明。正如其他人回答的那样,您可以使用new EngagementService()对其进行显式分配,但是如果使用Angular,则“正确”的处理方式是在第二个文件中使用依赖注入(DI):

constructor(private engagementService: EngagementService) {...}

通过在类声明之前添加EngagementService装饰器,确保您的@Injectable可注射:

@Injectable({
    providedIn: 'root'
})
export class EngagementService {
  ...
}