我正在開發一個Angular應用程序,其中包含用戶可以添加到的(金融)交易列表。這一直進展良好,我試圖從服務提供的靜態列表切換到嘗試從本地Node.js服務器獲取數據。我使用觀察者異步獲取交易列表。使用角度觀察者通過網絡獲取數據
我一直在關注Angular的HTTP tutorial和相關的plunker。但是,儘管我可以看到來自服務器的數據,但我無法使用.subscribe()方法從中獲取一組有用的數據。
這裏是我的服務,連接到節點服務器:
@Injectable()
export class TradeService {
private url = '...'; // URL to web API
tradeArray: Trade[] = [];
constructor(private http: Http) { }
//-----------GETTERS---------------//
getTradeObservable(): Observable<Trade> {
return this.http.get(this.url)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
console.log("body:" + body);
console.log("Entire Body.trades: " + body.trades);
return body.trades;
}
getTrades(): any {
this.getTradeObservable()
.subscribe(
trade => this.tradeArray.push(trade));
return this.tradeArray;
}
這裏是相關的部分節點服務器本身:
var TRADES = { "trades": [
{"id": 0, "cust": "Ben", "hasSub": true,
"subcust": "Rigby", "type": "s", "security": "001", "ticket": "99"},
...
{"id": 9, "cust": "Uber Bank", "hasSub": true,
"subcust": "Lil Bank", "type": "p", "security": "456", "ticket": "56"}
]};
////////////Get Requests/////////////////
//this route returns all data in JSON format
app.get('/', function(req, res) {
res.send(JSON.stringify(TRADES));
});
而從getTrades預期輸出的:
[
{id: 0, cust: "Ben", hasSub: true,
subCust: "Rigby", type: "s", security: '001', ticket: '99'},
...
{id: 9, cust: "Uber Bank", hasSub: true,
subCust: "Lil' Bank", type: "p", security: '456', ticket: '56'},
];
而地方之一的服務注入,並呼籲:
export class SubmittedComponent {
constructor(private tradeService: TradeService) { }
//initally show all trades
rows = this.tradeService.getTrades();
...
我可以在瀏覽器控制檯看到「整個body.trades」是我想要的數據的完整列表,但看起來訂閱並不是將它們推到tradeArray中,這最終未定義。
謝謝你的時間。
你可以發佈你從哪個組件調用服務?順便說一句,它是一個不好的做法,以訂閱您的服務內部。您的服務只應返回觀察對象 –
我已更新信息。感謝用戶的提示,我會研究一下。 –
@ Jota.Toledo你可以在服務中絕對訂閱,但仍然暴露一個可觀察的,我寫在這裏:http://blog.jonrshar.pe/2017/Apr/09/async-angular-data.html – jonrsharpe