Angular 2, ASP.Net Core и базовый CRUD через angular-сервис

252
28 ноября 2017, 19:38

Приветствую. Пробую себя в Angular 2 Asp.net Core. Возник стопор при работе с сервисом для получения данных с сервера. Не могу понять почему шаблон из "учебника" не работает. Выдает следующее:

Аргумент типа "(data: Order[]) => Order[]" нельзя назначить параметру типа "((value: Order) => void) | undefined".
  Тип "(data: Order[]) => Order[]" не может быть назначен для типа "(value: Order) => void".
    Типы параметров "data" и "value" несовместимы.
      Тип "Order" не может быть назначен для типа "Order[]".
        Свойство "length" отсутствует в типе "Order".

Если кто сталкивался ,помогите пожалуйста разобраться.

Сорцы: tendercreate.component.ts

import { Component, OnInit} from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms/src/model';
import { OrdersService } from "../../services/orders.service"
import { Order } from "../../shared/models";
@Component({
    selector: 'tender-create',
    templateUrl: './tendercreate.component.html',
    styleUrls:  ["./tendercreate.component.css"],
    providers: [OrdersService]
})
export class TenderCreateComponent implements OnInit{  
    order: Order= new Order();
    orders: Order[];
    constructor(private ordersService: OrdersService){}
    ngOnInit(){
        this.loadOrders();
    }
    loadOrders(){
        this.ordersService.getOrders()
        .subscribe((data: Order[]) => this.orders = data);
    }
    onSubmit(){
        // this.ordersService.createOrders(this.order)
        // .subscribe((data: any)=> this.orders.push(data));    
    }    
}

orders.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Order } from '../shared/models';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class OrdersService {
    private url = "/api/orders";
    constructor(private http: HttpClient) {
    }
    getOrders(): Observable<Order>{
        return this.http.get(this.url);
    }
    createOrders(neworder: Order){
        return this.http.post(this.url,neworder);
    }
}

models.ts

export class Order {
    constructor(
        public Caption?: string,
        public Text?: string,
        public Geomap?:string,
        public Cost?: number,
        public Viewers?: number,
        public UsersId?: number,
        public ThereImages?: boolean,
        public ThereFiles?: boolean
    ){}
}
export class User{
    constructor(){}
}

Пробовал по этому ответу,но не вышло.

Answer 1

Вот тут Observable<Order> компилятору указывается, что тип внутри Observable - Order

А вот тут .subscribe((data: Order[]) - уже Order[].

Чтобы все заработало, эти типы должны совпадать.

Судя по названию везде должно быть Order[].

Кроме того, так как теперь разбором json занимается сам HttpClient, при вызове ему можно указать какой тип ожидается:

return this.http.get<Order[]>(this.url);

В противном случае будет считаться, что возвращается Object.

READ ALSO
Как передать запрос к бд с формы?

Как передать запрос к бд с формы?

Подскажите, как правильно сделать запрос к БД с формыКак я понимаю, делать это надо с помощью инъекций:

230
Как проверить &ldquo;пойманные&rdquo; клавиши (hooked keys) в C#?

Как проверить “пойманные” клавиши (hooked keys) в C#?

Пишу простую (со своей стороны) программу, она состоит из готового пакета KeystrokeAPI, который ловит нажатые клавиши и выводит их на консоль, так...

207
Конвертация DateTime(string)

Конвертация DateTime(string)

Есть список дат с несколькими культурами языков таких как "24 августа 2017" и "4 jenuery 2017" нужно конвертировать в DateTime, как сделать одну культуру...

242
как показать результат в Datagrid ? (Entity Framework)

как показать результат в Datagrid ? (Entity Framework)

Есть таблица Выручка в базе данных SQLite

207