Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angular2:“导入”、注入和接口_Angular_Angular2 Services - Fatal编程技术网

angular2:“导入”、注入和接口

angular2:“导入”、注入和接口,angular,angular2-services,Angular,Angular2 Services,我已经掌握了angular2,虽然我对各种概念有很好的理解,但DI和import有些混乱 首先,我将一个类(我们称之为foo)导入到一个组件栏中 import { Component, OnInit } from '@angular/core'; import { Baz } from './foo'; @Component({ templateUrl: './my.component.html', styleUrls: ['./my.component.css'] }); expo

我已经掌握了angular2,虽然我对各种概念有很好的理解,但DI和import有些混乱

首先,我将一个类(我们称之为foo)导入到一个组件栏中

import { Component, OnInit } from '@angular/core';
import { Baz } from './foo';

@Component({
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.css']
});

export class bar implements OnInit {
  private baz:Baz;

  ngOnInit():void {
    this.baz = new Baz();    
  }
}
然后我开始阅读关于这种模式有多糟糕的文章:如果我需要更改Baz的构造函数,我需要重新访问Baz被更新的所有代码

所以,我开始研究注射Baz

我将@Injectable添加到Baz中,然后将组件更改为

import { Component, OnInit } from '@angular/core';
import { Baz } from './foo';

@Component({
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.css'],
  providers: [Baz]
});

export class bar implements OnInit {
  private baz:Baz;

  constructor(private baz:Baz) {}

  ngOnInit():void {}
}
这个很好用

然而,这让我开始思考:DI的全部意义在于允许您/应用程序/测试框架在需要时提供自己版本的Baz

因此,从'./foo'导入{Baz};变得有问题了,因为这是一个具体的实现,并且与特定的类紧密相连

说了这么多闲话之后,我的问题是

我应该使用接口而不是直接导入吗

如果是这样的话,作为一个全球接口会更好吗/// 接口定义的引用还是简单导入

如果在组件上定义了提供者部分, 子模块或模块级?-或者这取决于Baz的使用范围有多广


你真的应该读这本书

但为了帮助你:

我应该使用接口而不是直接导入吗? 你什么意思? javascript中没有接口这样的东西,这只是Typescript中的一个奇特的东西,它的创建只是为了帮助提供工具

是否应在组件、子模块或模块级别定义“提供程序”部分或者这取决于Baz的使用范围有多广

您提供的可注入类越高,越低的组件将获得相同的实例

如果提供一个IC可注入类,例如根级别的服务,则所有子组件都将获得samle实例,除非它们单独提供该实例

因此,简而言之,如果你不提供,DI将查找你的父母,为你找到服务


因此,如果您有一个保存服务或服务本身不包含任何状态,请将其放在根级别,不需要在组件级别提供。

是的,很抱歉,我应该提到我使用的是typescript。