我已经掌握了angular2,虽然我对各种概念有一个很好的理解,但DI和导入有些令人困惑。
首先,我导入了一个班级(让他们称之为" foo")到一个组件中(" bar")
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所有的代码" newed"。
所以,开始考虑注入Baz ..
我向Baz添加了@Injectable()
,然后将组件更改为
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"如果需要的话。因此,import { Baz } from './foo';
变得有问题,因为这是一个具体的"实施并与特定班级联系在一起。
在漫无目的之后,我的问题就是
我应该使用接口而不是直接导入吗?
如果是这样,它会更好地作为全局接口(.d.ts)," /// 参考"或者简单地导入接口定义?
"提供商"部分在组件中定义, 子模块或模块级别? - 或者这取决于广泛的" Baz"正在使用?
答案 0 :(得分:1)
你应该阅读Angular DI。
但是要帮助你:
我应该使用接口而不是直接导入吗? 你什么意思 ? 在javascript中没有接口这样的东西,这只是在Typescript中的一个奇特的东西,它只是为了帮助提供工具而创建的。
"提供商"部分是在组件,子模块还是模块级别定义的? - 或者这取决于广泛的" Baz"正在使用?
您提供Injectable类的根目录越远,进一步向下的组件就会获得相同的实例。
您在根级别提供IC(可注入类,E.g服务),除非他们单独提供,否则所有子组件都将获得samle实例。
简而言之,如果您不提供,DI会查找您的父母为您找到该服务。
因此,如果您有一个保存服务或服务本身不包含任何状态,请将其置于根级别,不需要在组件级别提供。