Typ 'Beobachtbare<alle>' ist nicht belegbar zu geben '[]'
Ich bin ziemlich neu in Angular2/Typoskript, so bitte entschuldigen Sie mich, wenn ich tun einige dumme Fehler. Was ich versuche zu tun, ist Wählen Sie aus drop down ich bin, Auffüllen der Daten mit service, die Rückkehr ist mir ein JSON-array.
Hier ist mein code:
product-maintenance.component.ts
import { Component, OnInit} from '@angular/core';
import { ProductMaintenanceService } from '../../_services/product-maintenance.service';
import { ModuleConst } from '../../../data/const';
import { Product } from './product-types';
import { Products } from './products';
@Component({
selector: 'app-product-maintenance',
templateUrl: './product-maintenance.component.html',
styleUrls: ['./product-maintenance.component.css']
})
export class ProductMaintenanceComponent implements OnInit {
selectedProduct: Product = new Product(0, 'Insurance');
products: Product[];
productList: Products[];
constructor( private productService: ProductMaintenanceService ) {
}
ngOnInit() {
//Dropdown list
this.products = this.productService.getProductTypeList();
}
//Populate data using onSelect method
onSelect(typeid) {
this.productList = this.productService.getProducts()
.filter((item)=>item.ptypeid == typeid);
}
}
product-type.ts
(für das Auffüllen drop-down-Liste):
export class Product {
constructor(
public ptypeid: number,
public name: string
) { }
}
products.ts
(für das Auffüllen von Daten vom Dienst):
export class Products {
constructor(
public id: number,
public ptypeid: number,
public name: string,
public currency: string,
public state: string,
public riskRating: number,
public clientSegment: string,
public aiStatus: string,
public premiumType: string,
public tenure: number
) { }
}
product-maintenance.service.ts
:
import { Injectable, Inject } from '@angular/core';
import { Http, Headers, RequestOptions, Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/filter';
import { APP_CONFIG, IAppConfig } from '../app.config';
import { Products } from './products';
import { Product } from './product-types';
@Injectable()
export class ProductMaintenanceService {
result: Array<Object>;
constructor(
@Inject(APP_CONFIG) private config: IAppConfig,
private http: Http
) { }
private productURL = 'data/productList.json';
//Get product list
getProducts() : Observable<any> {
//...using get request
return this.http.get(this.productURL)
//...and calling .json() on the response to return data
.map((response: Response) => {
console.log(response);
return response.json();
});
}
getProductTypeList() {
return [
new Product(1, 'Unit Trust'),
new Product(2, 'Insurance'),
new Product(3, 'Structured Deposit'),
new Product(4, 'Bonds'),
new Product(5, 'DCI'),
new Product(6, 'SP')
];
}
}
product-maintenance.component.html
:
<table>
<tr *ngFor="let item of productList">
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>{{ item.currency }}</td>
<td>{{ item.state }}</td>
<td>{{ item.riskRating }}</td>
<td>{{ item.clientSegment }}</td>
<td>{{ item.aiStatus }}</td>
<td>{{ item.premiumType }}</td>
<td>{{ item.tenure }}</td>
</tr>
</table>
productList.json
:
[
{
"ptypeid": 1,
"id": 1,
"name": "Unit Trust 1",
"currency": "SGD",
"state": "Active",
"riskRating": 1,
"clientSegment": "Retail/Premier",
"aiStatus": "No",
"premiumType": "Regular Premium",
"tenure": 5
},
{
"ptypeid": 2,
"id": 2,
"name": "Unit Trust 2",
"currency": "SGD",
"state": "Active",
"riskRating": 3,
"clientSegment": "Retail/Premier",
"aiStatus": "No",
"premiumType": "Single/Lumpsum Premium",
"tenure": 10
}
]
Wenn ich definiere meine getProducts()
als getProductTypeList()
dann ist es perfekt Auffüllen der Daten aus meiner Sicht (Wobei, wenn ich wählen Sie Gerät trust aus der drop-down-dann sollte es Auffüllen relevanten Daten). Aber wenn ich die Verwendung als api-url statt, gibt es mir folgende Fehlermeldung:
Type 'Observable<any>' is not assignable to type 'Products[]'. Property 'length' is missing in type 'Observable<any>'
Ich verstehe nicht, wie dieser Fehler behoben werden. Kann bitte jemand mir helfen, in diesem. Vielen Dank im Voraus.
- haben Sie es geschafft, zu lösen Ihre Beobachtbare problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
productList
sollteProduct[]
nichtObservable<any>
. So weisenproductList
Wert vongetProducts
subscribe-Methode, wo Sie abrufen, array mitProduct
Ändern Sie Ihre Methode getProducts-Methode zu
Ein paar Probleme, zuerst bemerkte ich Sie mit einem relativen url für die get-Anfrage. Das ist nicht zur Arbeit gehen. Du musst die richtige url, d.h. etwas, das beginnt mit
http://..
auch wenn Ihre api auf localhost müssen Sie die vollständige url.Zweitens, die get-Anfrage ist okay, aber Ihr Anruf in der Komponente sollte so Aussehen:
Da du eine Karte in Ihrem Wunsch, Sie auch anmelden müssen, sonst erhalten Sie keine Ergebnisse!
Erwähnenswert ist auch, da diese ist eine asynchrone operation, möchten Sie vielleicht, um eine
ngIf
in der Tabelle, so dass Ihre app wird nicht werfen eine Fehlermeldung bei Ansicht gerendert wird, bevor die Daten da sind, also nur dazu:Sollte dies aufklären!
Alternativ, wenn Sie nicht abonnieren möchten, können Sie tun, was Sie zuvor getan haben:
aber dann müssen Sie die
async
Rohr in der Ansicht:In diesem Fall die async-Leitung wird das Abo für dich 🙂