进口服务在抽象类中不确定



我已经抽象了类Collection,该类利用服务Database在数据库上初始化集合。我有几个Collection的子类实例,所有这些都需要进行相同的数据库初始化。因此Collection是某种基类。

令人惊讶的是,导入的服务Database是子类FooCollection的构造函数上的undefinedDatabase服务的构造函数肯定是在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 ) {
  }
}

编辑:

我注意到FooCollection上再次明确导入Database的工作正常:

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);
  }
}

这提出了一个问题,该问题是如何在抽象类的子类上处理的。

您应该在使用的模块中提供DB。还应该提供Foo Collection,因为请参阅plunk。

@NgModule({
  providers: [Database, FooCollection]

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

和扩展服务(b)用于解析器中。

解析器试图调用服务B中的方法,该方法使用A中的一种注射服务。但是注射的服务是未定义的。我再次检查,以2.4.5运行 - 工作就像魅力

相关内容

  • 没有找到相关文章

最新更新