在构造函数参数中初始化vs Angular 5中的新关键字?

时间:2018-04-11 13:47:50

标签: angular typescript

代码1:

foreach( $site_array as $site ){
// Visit "$site.'/my_script.php'"
// when "$site"'s ForEach loop is done, move to the next $site after a break
}
file_get_contents("file.php"); //example

代码2:

 import { Component,OnInit } from '@angular/core';
    import {exampleClass} from './exampleClass'
    @Component({
      selector: 'app-root',
      templateUrl: './app.component.html',
      styleUrls: ['./app.component.css']
    })
    export class AppComponent {
       list: number[] = [1, 2, 3];

       constructor(a:exampleClass) {
        a.hello();
       }
    }

exampleClass.ts Cose:

import { Component,OnInit } from '@angular/core';
import {exampleClass} from './exampleClass'
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
   list: number[] = [1, 2, 3];

   constructor() {
     const a = new exampleClass ;

   }

}

为什么代码1给出错误并且代码打印A在控制台中,什么是两种初始化方法之间的区别?

3 个答案:

答案 0 :(得分:1)

在您的第一个代码中,

export class AppComponent {
    list: number[] = [1, 2, 3];
    constructor(a:exampleClass) {
      a.hello();
    }
 }

exampleClass应该是service,而services可以作为constructor注入parameter

因此,您可能会收到错误没有HeroDetailComponent的提供程序

因此,如果exampleClass是一项服务,它可能会有效。

答案 1 :(得分:1)

您可能希望阅读Angular中的依赖注入https://angular.io/guide/dependency-injection-pattern(也可能是一般情况下)。

在第一种情况下,AppComponent无需了解exampleClass的详细信息。在第二种情况下,您决定使用什么类。

在第一种情况下,当AppComponent被实例化时,Angular将为您处理参数,实例化所需的类。这种方法的优点是你可能不想总是在那里使用相同的类。也许在你的测试中你想要使用另一个模拟类。在第二种情况下,您无法做到:AppComponentexampleClass紧密结合。

在第一种情况下,您可以决定组件将接收的实例类型,而不会影响组件。在第二种情况下,情况并非如此。如果您不想传递exampleClass,而是传递派生类,则应该触摸它。实际上,如果这些类的构造函数不是无参数的,那么AppComponent也必须知道如何实例化它们。

我认为,您收到错误的原因是您没有使用exampleClass装饰@Injectable()。这个装饰器告诉Angular这个类可以通过依赖注入实例化。

此外,您应该将exampleClass添加到providers

AppModule部分
@Injectable() export class exampleClass { ... }

@NgModule({
    providers: [exampleClass],
    ...
})
export class AppModule { }

答案 2 :(得分:1)

代码1是您希望服务<在组件之间共享

例如用于存储数据 - &gt;如果你这样做.service.data =&#39; test&#39 ;; 所有其他代码为1的组件都可以

console.log(this.service.data); // print 'test'

您实例化代码2,因此该服务一个范围在您的组件中的新实例