【发布时间】:2017-07-20 23:20:26
【问题描述】:
我正在尝试创建一个动态 ng2 search.service。 REST 服务是在我的组织中搜索数据的底层协议。这是我最初创建的用于搜索用户的 user.service:
import { Injectable } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import { User } from '../entities/user';
@Injectable()
export class UserService {
private headers = new Headers({ 'Content-Type': 'application/json' });
private usersUrl = 'http://localhost:4000/users';
private userUrl = 'http://localhost:4000/users/@id';
constructor(private http: Http) { }
getUser(id: number): Promise<User> {
return this.http.get('http://localhost:4000/users/1')
//return this.http.get(this.userUrl.replace('@id', id))
.toPromise()
//.then(this.extractData)
.then(response => response.json())
.catch(this.handleError);
}
getUsers(): Promise<User[]> {
return this.http.get(this.usersUrl)
.toPromise()
.then(response => response.json())
.catch(this.handleError);
}
private extractData(response: Response) {
return response.json();
}
private handleError(error: any): Promise<any> {
console.error('An error occurred', error); // for demo purposes only
return Promise.reject(error.message || error);
}
}
这是我对通用 search.service 的第一次尝试:
import { Injectable } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import { User } from '../entities/user';
@Injectable()
export class SearchService
{
private _headers = new Headers({ 'Content-Type': 'application/json' });
private _entityName = '';
private _allEntitiesUrl = 'http://localhost:4000/@entityNames';
private _entityByIdUrl = 'http://localhost:4000/@entityNames/@id';
constructor(private http: Http, entityName: string)
{
this._allEntitiesUrl = entityName + 's';
this._entityByIdUrl = entityName + 's';
}
getEntity(id: number): Promise<User>
{
var url = this._entityByIdUrl.replace('@id', id.toString());
return this.http.get(url)
.toPromise()
.then(response => response.json())
.catch(this.handleError);
}
getEntities(): Promise<User[]>
{
return this.http.get(this._allEntitiesUrl)
.toPromise()
.then(response => response.json())
.catch(this.handleError);
}
private extractData(response: Response)
{
return response.json();
}
private handleError(error: any): Promise<any>
{
console.error('An error occurred', error); // for demo purposes only
return Promise.reject(error.message || error);
}
}
search.service 现在只是部分完成。以下是我知道需要更新的一些内容:
-
import 语句需要通用或以某种方式适应可能从 search.service 返回的不同类型的实体。例如,search.service 可能会返回帐户、产品等:
从'../entities/user'导入{用户};
我需要弄清楚如何为 getEntity/getEntities 实现动态返回类型。过去我已经完成了一些工作来实现从 C# 返回泛型类型的方法,但不确定如何使用 ng2/typescript 完成此操作
我确定我不是第一个考虑这样做的人,所以希望这里的其他精通 ng2/typescript 的人可以解释我如何实现这一点?
【问题讨论】:
标签: javascript angular typescript design-patterns