中小型项目中ngModule每每只有一个,但在大型应用中,每每多个功能相关的ngModule。 定义在同一个ngModule中的视图组件,能够同范围内直接使用标签。html
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({
imports: [ BrowserModule ],
providers: [ Logger ],
declarations: [ AppComponent ],
exports: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
复制代码
声明模块中拥有的视图类。主要包括:组件,指令和管道。前端
declarations 的子集。导出,供其余模块引用。es6
声明须要的其余模块bootstrap
全局的服务列表,应用的任何部分均可以访问到。浏览器
指定根视图,仅根视图可配置此项。或者配置此项的组件,即为根视图。 渲染dom时候,会替换index.html 中app-root对应的元素。bash
针对须要运行在浏览器中module所必须的。app
表单处理,双向绑定,所必须的。dom
http请求所必须的。ide
@Component({
selector: 'app-hero-list',
templateUrl: './hero-list.component.html',
providers: [ HeroService ]
})
export class HeroListComponent implements OnInit {}
复制代码
有两种方式:post
@Component({
selector: 'app-hero-list',
templateUrl: './hero-list.component.html',
providers: [ HeroService ]
})
export class HeroListComponent implements OnInit {
复制代码
@Component({
selector: 'lightswitch-comp',
template: `
<button (click)="clicked()">Click me!</button>
<span>{{message}}</span>`
})
export class LightswitchComponent {}
复制代码
Angular发现某个组件依赖于服务时,它将首先检查注入程序是否具备该服务的任何现有实例。若是请求的服务实例尚不存在,则注入器使用注册的提供者建立一个实例,并将其添加到注入器中,而后再将服务返回到Angular。
注入依赖共三种方式,范围从大到小
@Injectable({
providedIn: 'root',
})
复制代码
@NgModule({
providers: [
BackendService,
Logger
],
...
})
复制代码
@Component({
selector: 'app-hero-list',
templateUrl: './hero-list.component.html',
providers: [ HeroService ]
})
复制代码
@NgModule({
providers: [
BackendService,
Logger
],
复制代码
// provide 为令牌名,useClass:对应的是服务名,angular根据令牌名,进行服务注入
//provide 与useClass同名
@NgModule({
providers: [
BackendService,
[{ provide: Logger, useClass: Logger }]
],
//provide与useClass不一样名,== 给服务起别名
@NgModule({
providers: [
BackendService,
{ provide: JsLogger, useClass: Logger }
],
复制代码
@NgModule({
providers: [
BackendService,
{ provide: API_URL, useValue: isProduction?'http://xxxxa.com':'http://zzzza.com' }
],
复制代码
@NgModule({
providers: [
BackendService,
{ provide: JSLoggerService, useFactory:() => {
if(isFileLogged){
return new FileLoggerService();
}
return new ConsoleLoggerService();
} }
],
复制代码
@NgModule({
providers: [
BackendService,
{ provide: API_URL, useValue: isProduction?'http://xxxxa.com':'http://zzzza.com' },
{ provide: JSBackendService, useExisting:BackendService }, //起别名+复用以前的服务
],
复制代码
使用依赖有如下两种方式:
构造方法中@Inject显示声明依赖
@Component({
selector: 'app-hero-list',
template: `
<div *ngFor="let hero of heroes">
{{hero.id}} - {{hero.name}}
</div>
`
})
export class HeroListComponent {
heroes: Hero[];
constructor(@Inject(HeroService) heroService: HeroService) {
this.heroes = heroService.getHeroes();
}
}
复制代码
构造方法中声明依赖
@Component({
selector: 'app-hero-list',
template: `
<div *ngFor="let hero of heroes">
{{hero.id}} - {{hero.name}}
</div>
`
})
export class HeroListComponent {
heroes: Hero[];
constructor(heroService: HeroService) {
this.heroes = heroService.getHeroes();
}
}
复制代码
@Component({
selector: 'app-hero-list',
template: `
<div *ngFor="let hero of heroes">
{{hero.id}} - {{hero.name}}
</div>
`
})
export class HeroListComponent {
heroes: Hero[];
logger:Logger;
constructor(heroService: HeroService,@Optional() private logger: Logger) {
this.heroes = heroService.getHeroes();
if (this.logger) {
this.logger.log(some_message);
}
}
}
复制代码
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';
import { environment } from './environments/environment';
if (environment.production) {
enableProdMode();
}
platformBrowserDynamic().bootstrapModule(AppModule);
复制代码