gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:57:20 26 4
gpt4 key购买 nike

我有抽象类 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();
}
}

数据库.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);
}
}

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

最佳答案

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

@NgModule({
providers: [Database, FooCollection]

关于angular - 导入的服务在抽象类上未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42614887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com