装饰器@Injectable在Angular 5+中的明确含义

时间:2018-07-27 01:58:11

标签: angular

据我所知,一个类可以使用装饰器(例如<script> $('#password, #password1').on('keyup change', function () { if (!$('#password').val()) { $('#message').html(''); }else if($('#password').val()<5){ $('#message').html('Password must be at least 5 digit!').css('color', 'red'); $('#submit').prop('disabled', false); } else { if ($('#password').val() == $('#password1').val()) { $('#message').html('Password Match').css('color', 'green'); $('#submit').prop('disabled', false); } else { $('#message').html('Password not Match').css('color', 'red'); $('#submit').prop('disabled', true); } } }); </script> @Injectable)从Angular注入器注入依赖项。

因此,我认为@Component装饰器是某种“徽章”,告诉Angular“ I(class)允许您注入我请求的依赖项”,我相信这是正确的。

但是官方文件中的这句话使我感到困惑:

@Injectable
  

@Injectable装饰器指示Angular DI系统用于创建一个或多个UserContextService实例。

据我所知,@Injectable() export class UserContextService {} 装饰器与注入器创建类的实例无关。

我想念什么吗?

P.S。 The official document link for the sentence above

1 个答案:

答案 0 :(得分:0)

足够有趣的是,关于此文档的文档是错误的。 @Injectable实际上表示“我(服务)可以向我注入其他服务”。考虑一下称为Service2的服务,该服务试图将Service1注入构造函数:

// If you remove this, you will get an error
@Injectable()
export class Service2 {
  constructor(private service: Service1) { 

  }
}

如注释中所述,删除@Injectable()会引发错误。您可以使用StackBlitz I created进行尝试。组件不需要@Injectable()即可向其中注入服务。

我发现了an issue where this was discussed,但似乎什么也没有。想想看,我看不起文档,却一直不正确地使用@Injectable()。谢谢您提出这个问题。

这促使我更加深入地研究了文档引用的测试。它失败了,但不是由于文档说失败的原因。他们实际上进行了一项测试,以验证您可以注入没有具有装饰器的服务。我为好奇的here写了更多信息。