gapi加载完成后加载Angular 5个组件
Load Angular 5 component after gapi has been loaded
我正在使用 CLI 编写 angular 5 应用程序。
我正在使用 gapi 检索用户数据以填充表单。
客户端脚本包含在 index.html 文件中:
<head>
<meta charset="utf-8">
<script src="https://apis.google.com/js/client.js"></script>
...
</head>
这是我调用的组件:
userProfileModel: UserProfileModel = new UserProfileModel();
ngOnInit() {
this.form = this.toFormGroup();
this.onFormChanges();
this.userService
.getUserById(this.userId)
.then(usr => {
this.mapModel(usr.result['profile']);
})
.then(() => {
this.form.patchValue(this.userProfileModel);
});
}
以及 userService 的方法:
declare var gapi: any;
export class UserService {
getUserById(id: number) {
return gapi.client.request({
method: 'GET',
'path': this.constants['endpoint_user_getbyid'] + '/' + id,
'root': this.constants['api_url']
});
}
...
}
问题是,gapi 似乎没有在我的组件加载完成后立即初始化:我必须设置 >500 毫秒的超时才能使用它,这很丑陋。
此代码出现以下错误:
ERROR TypeError: Cannot read property 'request' of undefined
请不要:
1- 我没有使用 npm / yarn 安装任何东西,我只是使用带有 gapi var 声明的脚本。
2 - 每次构建后,代码都能正常工作,并在第一次加载页面时填充我的表单,然后在刷新一次后,每次都会失败。
如何告诉 angular 在启动时加载 client.js 在所有组件之前?
谢谢!
感谢@ADarnal,我终于通过阅读这个主题找到了解决方案:
我遵循了 computeiro 的回答中描述的完全相同的过程。
我相当于 "BackendRequestClass" class 的是 GapiService。
在此 Gapi 服务中,加载方法允许我在执行任何其他调用之前加载 gapi :
/* GapiService */
loadGapi() {
return new Promise((resolve, reject) => {
gapi.load('client', () => {
gapi.client.init({apiKey: 'AIzaSyD5Gl9...'}).then(() => {
resolve(gapi.client);
})
});
});
}
// Method used in any component
getUserById(id: number) {
return gapi.client.request({
method: 'GET',
'path': this.constants['endpoint_user_getbyid'] + '/' + id,
'root': this.constants['api_url']
});
}
终于;在我的组件中,我注入了这个 gapiService 并且我能够在组件初始化时使用 client.request !
ngOnInit() {
this.gapiService
.getUserById(5066549580791808)
.then(
...
});
我正在使用 CLI 编写 angular 5 应用程序。
我正在使用 gapi 检索用户数据以填充表单。
客户端脚本包含在 index.html 文件中:
<head>
<meta charset="utf-8">
<script src="https://apis.google.com/js/client.js"></script>
...
</head>
这是我调用的组件:
userProfileModel: UserProfileModel = new UserProfileModel();
ngOnInit() {
this.form = this.toFormGroup();
this.onFormChanges();
this.userService
.getUserById(this.userId)
.then(usr => {
this.mapModel(usr.result['profile']);
})
.then(() => {
this.form.patchValue(this.userProfileModel);
});
}
以及 userService 的方法:
declare var gapi: any;
export class UserService {
getUserById(id: number) {
return gapi.client.request({
method: 'GET',
'path': this.constants['endpoint_user_getbyid'] + '/' + id,
'root': this.constants['api_url']
});
}
...
}
问题是,gapi 似乎没有在我的组件加载完成后立即初始化:我必须设置 >500 毫秒的超时才能使用它,这很丑陋。
此代码出现以下错误:
ERROR TypeError: Cannot read property 'request' of undefined
请不要:
1- 我没有使用 npm / yarn 安装任何东西,我只是使用带有 gapi var 声明的脚本。
2 - 每次构建后,代码都能正常工作,并在第一次加载页面时填充我的表单,然后在刷新一次后,每次都会失败。
如何告诉 angular 在启动时加载 client.js 在所有组件之前?
谢谢!
感谢@ADarnal,我终于通过阅读这个主题找到了解决方案:
我遵循了 computeiro 的回答中描述的完全相同的过程。
我相当于 "BackendRequestClass" class 的是 GapiService。
在此 Gapi 服务中,加载方法允许我在执行任何其他调用之前加载 gapi :
/* GapiService */
loadGapi() {
return new Promise((resolve, reject) => {
gapi.load('client', () => {
gapi.client.init({apiKey: 'AIzaSyD5Gl9...'}).then(() => {
resolve(gapi.client);
})
});
});
}
// Method used in any component
getUserById(id: number) {
return gapi.client.request({
method: 'GET',
'path': this.constants['endpoint_user_getbyid'] + '/' + id,
'root': this.constants['api_url']
});
}
终于;在我的组件中,我注入了这个 gapiService 并且我能够在组件初始化时使用 client.request !
ngOnInit() {
this.gapiService
.getUserById(5066549580791808)
.then(
...
});