Angular 2 - 什么是存储全局变量(如身份验证令牌)的最佳方式,以便所有类都可以访问它们?

Ang*_*arM 19 typescript angular

仅限Angular 2问题:

什么是存储全局变量(如身份验证令牌或基本URL)(环境设置)的最佳方法,以便所有类都可以访问它们而不会在刷新时丢失它们?

因此,当我登录时,我将为用户提供一个身份验证令牌,并且通常将其存储在$ rootscope中以获得角度1.x.

Cha*_*ani 15

那么要创建真正的全局范围数据,您应该在app bootstrapping期间将class\object\value注册为bootstrap函数的依赖参数

bootstrap(MyApp,[MyGlobalService]);

这将MyGlobalService在根级别注册您的服务(实际上它可以是对象或工厂函数或您自己的提供者).现在可以将此依赖项注入任何组件.

与Angular1不同,Angular2应用程序可以使用多个Injectors,在组件和注入器之间进行一对一映射.每个组件都有自己的注入器.

Angular开发人员指南有一些很好的注册示例.请参阅依赖注入指南.

@Yaniv已经强调了另一个选项.

  • 那么如何将全局服务的变量访问到其他子类/组件中? (3认同)
  • @PardeepJain注入他们的构造函数 (3认同)

Yan*_*aim 5

在我看来,像$ rootScope这样在全局变量上存储这样的参数被认为是一种不好的做法.在Angular 1.x上,你应该使用服务(singelton)来从任何地方获取这些数据.这样您的数据就可以从任何地方获得 - 您可以注入您的服务并获得价值.您还可以在单​​元测试时模拟/侦察此服务.

应将Angular 2应用程序构建为组件树.我想你的方案的最佳解决方案是使用根组件下的服务保存它,并将其作为输入传递给子组件.

这样,您的数据将从主要组件进行控制.它将是不可变的(子组件不能更改它),并且您的组件将没有外部引用(这是迈向良好组件体系结构的重要一步).

如果您仍然希望以"Angular 1.x方式"执行此操作,我想您可以在任何地方注入此服务并使用其值.它不太受欢迎,但它比全局变量更好!

希望这很有帮助.

  • @PardeepJain那是Angular 2的方式,很多重复的事情 (3认同)
  • 根据你我必须使类/服务然后在这里声明我要使用的全局变量然后我必须在所有子组件中导入此服务?通过使用这个,如果我有50多个类/组件,那么我必须导入这个服务50 +倍而不是它太长的过程? (2认同)