角度2

时间:2018-01-22 19:16:01

标签: angular

我是棱角分明的新手。我已经开始在角度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();
   } 
}

我不知道他们俩彼此之间的差异。

1 个答案:

答案 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()装饰器添加到每个服务中,这样如果以后的开发人员确实将服务注入到服务中,它就不会产生错误。