javascript – Angular DI和继承:注入基本服务的扩展
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Angular DI和继承:注入基本服务的扩展,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2083字,纯文字阅读大概需要3分钟。
内容图文
![javascript – Angular DI和继承:注入基本服务的扩展](/upload/InfoBanner/zyjiaocheng/706/5f386c2be46141448ca7b6ac4234da4e.jpg)
我有一个基本服务和两个继承服务:
@Injectable({ providedIn: 'root' })
export class BaseService {
foo(src?: string){
return `speaking from ${src || 'BaseService'}`;
}
}
@Injectable({ providedIn: 'root' })
export class SomeService extends BaseService {
foo(){
return super.foo('SomeService')
}
}
@Injectable({ providedIn: 'root' })
export class AnotherService extends BaseService {
foo(){
return super.foo('AnotherService')
}
}
我希望将它们注入到某个组件中并检索三个单独类的实例:
@Component({
selector: 'my-app',
template: `
<div>
<p>Who's there?</p>
<p>{{ base }}</p>
<p>{{ some }}</p>
<p>{{ another }}</p>
</div>
`,
})
export class App {
base: string;
some: string;
another: string;
constructor(base: BaseService, some: SomeService, another: AnotherService) {
this.base = base.foo();
this.some = some.foo();
this.another = another.foo();
}
}
相反,我得到了同一个类的三个实例(HTML输出):
Who's there?
speaking from BaseService
speaking from BaseService
speaking from BaseService
>为什么这不起作用?
>为什么SomeService,AnotherService和BaseService不是Angular DI的唯一令牌?
似乎放
...
{ provide: SomeService , useClass: SomeService },
{ provide: AnotherService , useClass: AnotherService },
...
在提供商将使其工作.
>为什么明确需要这个?
一个plnkr:https://next.plnkr.co/edit/BvmppLHRbFbz9CFZ
解决方法:
SomeService和AnotherService从BaseService继承装饰器元数据,因此angular会在其位置注入BaseService实例.
这很危险,因为调用SomeService或AnotherService中的任何实例成员都不会从BaseService继承,这会触发运行时错误.
存档您正在寻找的行为的最简单方法是从公共抽象基类继承,没有装饰器:
export abstract class AbstractBaseService {
foo(src?: string) {
return `speaking from ${src || 'AbstractBaseService'}`;
}
}
@Injectable({ providedIn: 'root' })
export class BaseService extends AbstractBaseService {
foo() {
return super.foo('BaseService');
}
}
@Injectable({ providedIn: 'root'})
export class SomeService extends AbstractBaseService {
foo() {
return super.foo('SomeService');
}
}
@Injectable({ providedIn: 'root' })
export class AnotherService extends AbstractBaseService {
foo() {
return super.foo('AnotherService');
}
}
我modified your plnkr测试这种方法.
内容总结
以上是互联网集市为您收集整理的javascript – Angular DI和继承:注入基本服务的扩展全部内容,希望文章能够帮你解决javascript – Angular DI和继承:注入基本服务的扩展所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。