Как получить значения для конкретного идентификатора в Angular с использованием API (CRUD в Angular с использованием API)

Я выполняю CRUD в Angular, используя API в Laravel. Я добавил значения и получил значения, но я не могу обновить значения с помощью Id.

Это мой app.component.ts:

import {Component } from '@angular/core';
import {HttpClient, HttpHeaders } from '@angular/common/http';
import {Employee} from './employees';
import {EditComponent} from './edit/edit.component';
import {AppService} from './app.service';
import {Router} from '@angular/router';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [AppService]
})
export class AppComponent {
    form:any = {}
    msg: string = null;
    employees: Employee[];
    constructor( public http: HttpClient,private appService:AppService,private router: Router)
    {}

    onSubmit(){ 
      const httpOptions = {
        headers: new HttpHeaders({ 'Content-Type': 'application/json' })
      };
      this.http.post('http://127.0.0.1:8000/api/employee',this.form,httpOptions)
      .subscribe(function(s){console.info('sss',s);},function(e){console.info('e',e);});
    }

    ngOnInit() {
    }

    getEmployee():void{
       this.appService.getEmployees().subscribe(employees=>(this.employees = employees))
     }
    }

    public editComponent: boolean = false;
    loadMyChildComponent($id) {
      this.editComponent = true;
      this.appService.setCurrentId($id);
    }
 }

В loadMyChildComponent ($ id) я получаю идентификатор строки для редактирования.

Это мой app.service.ts:

import {Injectable } from '@angular/core';
import {HttpClient,HttpParams} from '@angular/common/http';
import {HttpHeaders} from '@angular/common/http';
import {Observable} from 'rxjs';
import {Employee} from './employees';
import {EditComponent } from './edit/edit.component';

const httpOptions = {
  headers: new HttpHeaders({ 'Content-Type': 'application/json' })
};

@Injectable({
  providedIn: 'root'
})
export class AppService {
  employee: Employee[];
  id: number;
  private url = 'http://localhost:8000/api/employee/';
  constructor(private http: HttpClient) { }

  setCurrentId(id){
    this.id=id;
  }
  getCurrentId(){
   return  this.id;
  }

   getEmployees(): Observable<Employee[]>{
    return this.http.get<Employee[]>(`http://localhost:8000/api/employees`); 
   }

   editEmployees(id): Observable<{}>
   {
   const url2 = `http://localhost:8000/api/employee/${id}`;
   return this.http.get<Employee[]>(url2);
   }

  updateEmployees(employee: Employee): Observable<any> {
  return this.http.put(this.url, employee, httpOptions);
  }

}

В этом app.service.ts я получаю значения для конкретного идентификатора с помощью функции editEmployees (id).

Это мой edit.component.ts:

import {Component, OnInit, Input } from '@angular/core';
import {AppService } from '../app.service';
import {Employee } from '../employees';
import {Router } from '@angular/router'; 
import {HttpClient, HttpHeaders } from '@angular/common/http';
import {NgForm} from '@angular/forms';
import {Observable} from 'rxjs';
import {ActivatedRoute} from '@angular/router';
import {FormBuilder, FormGroup, Validators} from "@angular/forms";
@Component({
  selector: 'app-edit',
  templateUrl: './edit.component.html',
  styleUrls: ['./edit.component.css']
})
export class EditComponent implements OnInit {
  @Input() employee: Employee;
  form:any = {}

  constructor(public http: HttpClient,private appService:AppService,private router: Router,private route: ActivatedRoute) { }

  ngOnInit():void {
    this.editEmployees();
  }

  editEmployees(): void {
    const id =  this.appService.getCurrentId();
    this.appService.editEmployees(id).subscribe(employee => employee);
     console.info(id);
     console.info(employee);
  }

  onformSubmit():void{ 
    this.appService.updateEmployees(this.form.id)
     .subscribe(employee => employee = employee);
}
}

Когда я печатаю значения в консоли с помощью функции editEmployees (), отображается значение undefined.

Это мой employee.ts:

export interface Employee{
    id: number;
    username:string;
    email:string;
    mobile:string;
    password:string;
}

Это мой app.component.html:

<table class = "table"> 
  <tr>
  <th>Id</th>
  <th>User Name</th>
  <th>Email</th>
  <th>Mobile</th>
  <th>Edit</th>
  <th>Delete</th>
  </tr>
  <tr *ngFor = "let employee of employees">
    <td>{{employee.id}}</td>
    <td>{{employee.username}}</td>
    <td>{{employee.email}}</td>
    <td>{{employee.mobile}}</td>
    <td><button (click) = "loadMyChildComponent(employee.id);" class = "btn btn-primary" [routerLink] = "['/edit',employee.id]">Edit</button></td>
    <td><button class = "btn btn-danger" (click) = "delete(employee)" > Delete</button></td>
</table>

Процесс таков: когда я нажимаю кнопку редактирования в app.component.html, он берет идентификатор и переходит на app.component.ts. Из app.component.ts он перейдет в app.service.ts, где получит значения из API, используя определенный идентификатор. Из app.service.ts он передаст значения в edit.component.ts, а используя edit.component.ts, он передаст значения в edit.component.html.

Но проблема в том, что в edit.component.ts он показывает undefined в функции editEmployees (). Любая помощь очень ценится.

Я не вижу навигации по маршрутизатору. Как вы перешли к редактированию компонента?

rvkant 27.12.2018 07:23

@rvkant. В app.component.ts this.editComponent = true; Я показываю компонент редактирования, нажимая кнопку редактирования.

user8531037 27.12.2018 07:25

@rvkant. Я добавил ссылку на маршрутизатор в app.component.html на кнопку редактирования.

user8531037 27.12.2018 07:28

Службы не должны иметь состояние. Сохранение идентификатора в сервисе делает его с отслеживанием состояния. Что делать, если в app.service делается несколько вызовов? вы можете получить неожиданные результаты. Кроме того, службы должны быть одноэлементными, т.е. изменение состояния не допускается. Я считаю, что ваш идентификатор вообще не сохраняется. Итак, распечатайте переменную url2 в функции editEmployees и проверьте, существует ли она.

rvkant 27.12.2018 07:37

@rvkant. Да, это показывает идентификатор.

user8531037 27.12.2018 07:42
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
5
3 935
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените следующее:

this.appService.editEmployees(id).subscribe(employee => employee);
 console.info(id);
 console.info(employee);

к

this.appService.editEmployees(id).subscribe(employees => {
   this.employee = employees[0];
   console.info(id);
   console.info(employee);
});

в вашем файле edit.component

Он показывает ошибку, например: В типе '{}' отсутствуют следующие свойства из типа 'Сотрудник': идентификатор, имя пользователя, адрес электронной почты, мобильный телефон, пароль. В этом коде VS отображается ошибка: this.employee = employee;

user8531037 27.12.2018 08:01

И когда я запускаю код с ошибкой, он также показывает значения в консоли и в форме. Спасибо за это. Можете ли вы помочь мне в этой ошибке.

user8531037 27.12.2018 08:04

Пожалуйста, используйте правильный тип. Ваша служба возвращает массив сотрудников, но вы назначаете его единственному объекту типа Employee в своем edit.component.

rvkant 27.12.2018 08:08

Из службы я получаю только пользовательские значения в соответствии с Id. editEmployees (id): наблюдаемый <{}> {const url2 = http://localhost:8000/api/employee/${id}; вернуть this.http.get <Сотрудник []> (url2); }

user8531037 27.12.2018 08:11

Я отредактировал ответ. Пожалуйста, попробуйте это. Кроме того, типы определяются API сервера, и служба должна соответствовать тому же типу. Например, если http://localhost:8000/api/employee/${id} возвращает массив сотрудников, только тогда Employee[] является допустимым типом возвращаемого значения. Однако, если api возвращает только один объект, то это должен быть Employee, а не Employee[].

rvkant 27.12.2018 08:23
editEmployees(id): Observable<{}> говорит, что вы вернете объект, но return this.http.get<Employee[]>(url2); возвращает массив сотрудников. Измените editEmployees(id): Observable<{}> на editEmployees(id): Observable<Employee[]>, и проблема должна исчезнуть.
rvkant 27.12.2018 08:28

Спасибо за ваше время и поддержку. Проблема решена.

user8531037 27.12.2018 08:53

Другие вопросы по теме