导入的服务在抽象类上未定义

问题描述 投票:0回答:2

我有抽象类

Collection
,它利用服务
Database
来初始化数据库上的集合。我有几个
Collection
的子类实例,它们都需要执行相同的数据库初始化。所以
Collection
是某种基类。

令人惊讶的是,导入的服务

Database
是在子类
undefined
的构造函数上的
FooCollection
Database
服务的构造函数肯定是在
Foobar
构造函数之前调用的。

为什么导入的服务在

FooCollection
上未定义?

这是一个误解的原因还是与类的加载顺序有关?

Collection.ts
:

import { Database } from '../providers/database';
import {Injectable} from "@angular/core";

@Injectable()
export abstract class Collection {

  public name : string;

  constructor(public db : Database) {
     // db is undefined here -> crash
     db.doSomething();
  }
}

Database.ts
:

import {Injectable} from '@angular/core';
import 'rxjs/add/operator/map';

@Injectable()
export class Database {

  private _db: any = null;

  constructor() {
    console.log('Hello Database Provider');
  }

  public doSomething(): void {
      console.log("doSomething");
  }
}

FooCollection.ts
:

import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
import { Collection} from '../classes/collection';


@Injectable()
export class FooCollection extends Collection{
}

app.module.ts
:

import { NgModule, ErrorHandler } from '@angular/core';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';
import { Start } from '../pages/page/start';
import { Database } from '../providers/database';
import { FooCollection } from "../providers/foocollection";

@NgModule({
  declarations: [
    MyApp,
    Start
  ],
  imports: [
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    Start
  ],
  providers: [
    {provide: ErrorHandler, useClass: IonicErrorHandler},
    Database,
    FooCollection
   ]
})
export class AppModule {}

Start.ts
:

import { Component } from '@angular/core';

import { NavController } from 'ionic-angular';

import { FooCollection } from '../../providers/foocollection';

@Component({
  selector: 'page-start',
  templateUrl: 'start.html'
})
export class Start{
  constructor(public navCtrl: NavController, public f: FooCollection ) {
  }
}

编辑:

我注意到在

Database
上再次显式导入
FooCollection
效果很好:

import { Injectable } from '@angular/core';
import { Database } from './database';
import 'rxjs/add/operator/map';
import { Store } from '../classes/store';

@Injectable()
export class Calls extends Store {
  constructor(public db : Database) {
    super(db);
  }
}

这就提出了如何在抽象类的子类上处理导入的问题。

angular typescript dependency-injection ionic2
2个回答
2
投票

您应该在使用它的模块中提供 db。还应该提供 Foo 集合,因为请参阅 plunk

@NgModule({
  providers: [Database, FooCollection]

0
投票

我无法评论,所以我写在这里。 我刚刚将我的应用程序从 2.4.5 升级到 4.0.0,现在我面临同样的问题! 我有一个抽象服务(a),它注入一个缓存服务(受保护) 扩展该服务 (b) 以添加功能。

扩展服务 (b) 在解析器中使用。

解析器尝试调用服务 B 中的方法,该方法使用 A 中注入的服务之一。但这些注入的服务未定义。 我再次检查过,在 2.4.5 中运行 - 就像一个魅力

© www.soinside.com 2019 - 2024. All rights reserved.