我是棱角分明的新手。我已经开始在角度2的服务工作了。 我知道我们需要使用@Injectable()来装饰类,使其成为一个服务,如下所示。
import {Injectable} from '@angular/core'
@Injectable()
export class MyFirstServiceClass{
SayHelloToService(){
alert('Service called');
return 'Hello, welcome your service...';
}
}
之后我们从组件类的构造函数中访问它,如下所示:
import { Component } from '@angular/core';
import {MyFirstServiceClass} from './FirstService.service'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
constructor(private servtest : MyFirstServiceClass )
{
this.title = servtest.SayHelloToService();
}
}
我的模板代码:
<div style="text-align:center">
{{title}}
<button id='btn' (click)='servtest.SayHelloToService()'>Click Me !
</button>
</div>
当组件创建完成时,我甚至可以在按钮点击和页面加载时看到结果,所以没问题。
但是,我只能通过创建该类'MyFirstServiceClass'的实例来直接访问,而不需要任何类型的@injectable,如下所示:
export class AppComponent {
title = 'app';
servtest = new MyFirstServiceClass();
func1(){
this.title= this.servtest.SayHelloToService();
}
}
我不知道他们俩彼此之间的差异。
答案 0 :(得分:3)
@Injectable()
装饰器不会使类成为服务。任何课程都可以成为一项服务。它是否像服务一样,是由您如何注册它定义的。如果它在模块或组件的provider
数组中注册,则它是一项服务。
providers: [
ProductService,
ProductEditGuard,
ProductParameterService
]
添加@Injectable()
只需告诉服务它需要注入其他服务。像这样:
@Injectable()
export class ProductService {
private productsUrl = 'api/products';
private products: IProduct[];
constructor(private http: HttpClient) { }
// ...
}
在没有@Injectable()
装饰器的情况下尝试上述代码会产生语法错误:Uncaught (in promise): Error: Can't resolve all parameters for ProductService
注意:考虑&#34;最佳做法&#34;将@Injectable()
装饰器添加到每个服务中,这样如果以后的开发人员确实将服务注入到服务中,它就不会产生错误。