Angular 2 从服务到组件的传递值
Angular 2 passing value from service to component
服务内部函数:
getUserInfo() {
this.af.authState.subscribe(authData => {
let email = authData.email;
let array = this.database.list('registeredUsers', {
query: {
orderByChild: 'email',
equalTo: email
}
}).subscribe(data => {
let userFName = data[0].firstName;
});
});
}
组件:
ngOnInit() {
this.afService.getUserInfo();
}
函数本身运行良好,但如何传递要在组件内使用的 let userFName
变量?
听起来您想要的是将其变成可注入服务。这将使您可以从任何组件调用它。
最好为 return 创建一个新的承诺,您可以在 database.list 调用解决后解决它。
@Injectable()
export class MyService() {
public userFName;
getUserInfo() {
// return a new promise, which you resolve once you get the data
return new Promise((resolve, reject) => {
this.af.authState.subscribe(authData => {
let email = authData.email;
let array = this.database.list('registeredUsers', {
query: {
orderByChild: 'email',
equalTo: email
}
}).subscribe(data => {
let userFName = data[0].firstName;
// resolve promise with username
resolve(userFName);
});
});
});
}
}
和你的组件
@Component({
providers: [MyService]
)
}
export class MyComponent {
constructor(private myService: MyService) {
myService.getUserInfo().then(userFName => {
console.log('userFName =', userFName);
});
}
}
如果您使用 @angular/http
,您的 http 请求应该 return rxjs/Observable
。一旦您订阅它,它就会 return 订阅。您无法重新订阅 class。
import {Observable} from "rxjs";
@Injectable()
export class MyService() {
public userFName;
getUserInfoPromise():Observable<MyResponseType> {
let someObservable = this.someApi.someRequestPOST(request).mergeMap((response:MyResponsType) => {
//you can process the response data here before components use it
this.userFName = response.userFName;
return new Promise(resolve => resolve(response));
});
return someObservable;
}
}
而在你的组件中,只需以这种方式加入订阅链即可。
this.myService
.getUserInfoPromise(requestData)
.subscribe(
(res: MyResponseType) => {
}, (error) => {
});
服务内部函数:
getUserInfo() {
this.af.authState.subscribe(authData => {
let email = authData.email;
let array = this.database.list('registeredUsers', {
query: {
orderByChild: 'email',
equalTo: email
}
}).subscribe(data => {
let userFName = data[0].firstName;
});
});
}
组件:
ngOnInit() {
this.afService.getUserInfo();
}
函数本身运行良好,但如何传递要在组件内使用的 let userFName
变量?
听起来您想要的是将其变成可注入服务。这将使您可以从任何组件调用它。
最好为 return 创建一个新的承诺,您可以在 database.list 调用解决后解决它。
@Injectable()
export class MyService() {
public userFName;
getUserInfo() {
// return a new promise, which you resolve once you get the data
return new Promise((resolve, reject) => {
this.af.authState.subscribe(authData => {
let email = authData.email;
let array = this.database.list('registeredUsers', {
query: {
orderByChild: 'email',
equalTo: email
}
}).subscribe(data => {
let userFName = data[0].firstName;
// resolve promise with username
resolve(userFName);
});
});
});
}
}
和你的组件
@Component({
providers: [MyService]
)
}
export class MyComponent {
constructor(private myService: MyService) {
myService.getUserInfo().then(userFName => {
console.log('userFName =', userFName);
});
}
}
如果您使用 @angular/http
,您的 http 请求应该 return rxjs/Observable
。一旦您订阅它,它就会 return 订阅。您无法重新订阅 class。
import {Observable} from "rxjs";
@Injectable()
export class MyService() {
public userFName;
getUserInfoPromise():Observable<MyResponseType> {
let someObservable = this.someApi.someRequestPOST(request).mergeMap((response:MyResponsType) => {
//you can process the response data here before components use it
this.userFName = response.userFName;
return new Promise(resolve => resolve(response));
});
return someObservable;
}
}
而在你的组件中,只需以这种方式加入订阅链即可。
this.myService
.getUserInfoPromise(requestData)
.subscribe(
(res: MyResponseType) => {
}, (error) => {
});