我是Angular 2的初学者,我正在尝试了解如何从功能模块中导出类,并将其导入我的主模块。
当我尝试在打字稿中编译时,我收到以下两个错误:
app / app.component.ts(11,21):错误TS2304:找不到名字 ' AddService&#39 ;.
app / app.module.ts(4,9):错误TS2305:模块 '" C:/angular/app/add/arithmetic.module"'没有导出的成员 ' AddService'
我的树很简单:
/
index.html
package.json
systemjs.config.js
tsconfig.json
typings.json
app/
app.component.html
app.component.ts
app.module.ts
main.ts
add/
add.service.ts
arithmetic.module.ts
有趣的部分如下:
app.module.ts:
import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {AppComponent} from './app.component';
// this next line generates an error from typescript compiler:
// app/app.module.ts(4,9): error TS2305: Module
// '"C:/angular/app/add/arithmetic.module"' has no exported
// member 'AddService'.
import {AddService} from './add/arithmetic.module';
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent, AddService],
bootstrap: [AppComponent]
})
export class AppModule { }
app.component.ts
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: 'app/app.component.html'
})
export class AppComponent {
calculate() {
// this next line generates the error:
// app/app.component.ts(11,21):
// error TS2304: Cannot find name 'AddService'.
var c = new AddService();
var x = c.addTwoNumbers(3, 5);
console.log(x);
}
}
arithmetic.module.ts
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {AddService} from './add.service';
@NgModule({
imports: [CommonModule],
exports: [AddService]
})
export default class ArithemeticModule { }
add.service.ts
export class AddService {
addTwoNumbers(a: number, b: number) : number {
return a + b;
}
}
这真的令人沮丧,因为
1)我导出AddService - 它被标记为' export'从ArithmeticModule中我将它标记为使用@NgModule元数据导出。
2)我从主模块中导入[涉嫌]导出的AddService类,因此AddService应该可用,因为它是从ArithmeticModule导出的
如果我直接从组件中导入AddService,它可以正常工作,但这不是我想要的:我想从我的主模块导入类,并利用它的导出模块,就像我们为Angular的模块(例如,BrowserModule和FormsModule)所做的那样。 @NgModule的文档说我们应该能够做到这一点 - 从我的功能模块导入一次到我的主模块,然后它可以在整个主模块中使用。
有人可以告诉我我做错了什么吗?或者我误解了应该使用哪些模块?
答案 0 :(得分:10)
对于使用providers: [...]
的服务,它们将被添加到根注入器(来自非延迟加载的模块)。
exports: []
用于导出指令,组件和管道的指令,组件,管道和模块。
答案 1 :(得分:2)
我可以从这里看到几个错误,
1)如果你想在任何地方使用 AddService ,最好将其注入 AppModule ,如下所示,(从arithmetic.module中删除AddService)
import {AddService} from './add/arithmetic.module';
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent, AddService],
bootstrap: [AppComponent],
providers: [AddService] //<<<===here
})
export class AppModule { }
2)服务应可注射
import {Injectable} from '@angular/core'; //<<<===here
@Injectable() //<<<===here
export class AddService {
addTwoNumbers(a: number, b: number) : number {
return a + b;
}
}
3)如何在 app.component.ts
中使用import {AddService} from './add/arithmetic.module';
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: 'app/app.component.html'
})
export class AppComponent {
constructor(private s:AddService){} //<<<===here
calculate() {
// var c = new AddService();
var x = s.addTwoNumbers(3, 5); //<<<===here
console.log(x);
}
}