Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
“Angular9”中没有“$rootScope”。可以使用什么?_Angular9 - Fatal编程技术网

“Angular9”中没有“$rootScope”。可以使用什么?

“Angular9”中没有“$rootScope”。可以使用什么?,angular9,Angular9,在AngularJS中,我使用$rootScope传递用户数据,例如: $ rootScope.user = { id: '4', username: 'user' ... }; $ rootScope.user.authenticated = false; 每次使用对SQL的查询打开或更新页面时,都会填充$rootScope中的数据 在Angular 9中,我没有找到$rootScope的用法。 告诉我,这些数据可以存储在Angular 9中的什么位置?在Angular中,如果您需要类似的内

AngularJS
中,我使用
$rootScope
传递用户数据,例如:

$ rootScope.user = {
id: '4',
username: 'user'
...
};
$ rootScope.user.authenticated = false;
每次使用对
SQL
的查询打开或更新页面时,都会填充
$rootScope
中的数据

Angular 9
中,我没有找到
$rootScope
的用法。
告诉我,这些数据可以存储在
Angular 9
中的什么位置?在Angular中,如果您需要类似的内容,您可以创建一个服务,在root中提供,并在任何需要的地方注入它。例如:

$ rootScope.user = {
id: '4',
username: 'user'
...
};
$ rootScope.user.authenticated = false;
服务:

//创建服务(providedIn:'root')使其全局可用
@可注射({providedIn:'root'})
导出类用户服务{
用户:有吗={
id:'4',
用户名:“用户”
...
};
}
在组件中使用服务:
@组件({…})
导出类MyComponent实现OnInit{
_未验证:布尔值;
//注入服务
构造函数(私有_userService:userService){}
恩戈尼尼特(){
//使用服务
此.\u isAuthenticated=\u useService.user?.authenticated??false;
}
}
PS:上面的代码使用了两种(在我写这个答案时是新的):可选链接和空合并。您始终可以使用常规三元运算符,而不是:

this.\u isAuthenticated=\u useService.user_useService.user?.authenticated:false

当我和我的团队将其中一个项目从AngularJS迁移到AngularJS时,我查看了$rootScope在旧应用程序中的使用时间,结果发现它95%的时间用于身份验证。其他一些用例涉及微调器、与浏览器相关的设置和边缘情况

看起来您的用例也与我们的相似。我刚刚将$rootScope.user折叠到一个名为identity的现有AngularJS服务中(或者它可以是auth,或者其他)。因此,在每个引用$rootScope.user的组件中,我将其替换为以下内容。构造函数只是依赖注入,允许您在任何地方使用identity服务中的变量

不管怎样

currentUser = this.identity.currentUser
constructor(private identity: IdentityService) {}
标识服务如下所示。当前用户有一个getter函数,当它不可用时,可以查看cookie,否则,它是一个空白对象(未经验证)

identity.service.ts

private _currentUser;  //should only obtain currentUser via get currentuser()

constructor(private cookieService: CookieService) {}

get currentUser() {
    if (!this._currentUser) {
      this._currentUser = this.getUserFromCookie() || {};  //get from cookie
    }
    return this._currentUser;
  }

getUserFromCookie() {
    return this.cookieService.get('currentUser') ? JSON.parse(this.cookieService.get('currentUser')) : {};
  }

希望这能让你开始并帮助他人。

谢谢。告诉我,如何使其全局化,而不是针对特定组件?它是全局的,但具有角度样式。我的意思是,在root中提供的服务是一种全局性的方式,您可以在任何需要的地方注入它们。这种方法是否有任何特定的场景不适合您的设计?到目前为止,您只对这种可能性感兴趣。事实上,您可以提供的不仅仅是服务。您还可以提供值,只要为其构建标记即可。你可以阅读更多关于它的内容