Я выполняю 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. В app.component.ts this.editComponent = true; Я показываю компонент редактирования, нажимая кнопку редактирования.
@rvkant. Я добавил ссылку на маршрутизатор в app.component.html на кнопку редактирования.
Службы не должны иметь состояние. Сохранение идентификатора в сервисе делает его с отслеживанием состояния. Что делать, если в app.service делается несколько вызовов? вы можете получить неожиданные результаты. Кроме того, службы должны быть одноэлементными, т.е. изменение состояния не допускается. Я считаю, что ваш идентификатор вообще не сохраняется. Итак, распечатайте переменную url2 в функции editEmployees и проверьте, существует ли она.
@rvkant. Да, это показывает идентификатор.






Измените следующее:
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;
И когда я запускаю код с ошибкой, он также показывает значения в консоли и в форме. Спасибо за это. Можете ли вы помочь мне в этой ошибке.
Пожалуйста, используйте правильный тип. Ваша служба возвращает массив сотрудников, но вы назначаете его единственному объекту типа Employee в своем edit.component.
Из службы я получаю только пользовательские значения в соответствии с Id. editEmployees (id): наблюдаемый <{}> {const url2 = http://localhost:8000/api/employee/${id}; вернуть this.http.get <Сотрудник []> (url2); }
Я отредактировал ответ. Пожалуйста, попробуйте это. Кроме того, типы определяются API сервера, и служба должна соответствовать тому же типу. Например, если http://localhost:8000/api/employee/${id} возвращает массив сотрудников, только тогда Employee[] является допустимым типом возвращаемого значения. Однако, если api возвращает только один объект, то это должен быть Employee, а не Employee[].
editEmployees(id): Observable<{}> говорит, что вы вернете объект, но return this.http.get<Employee[]>(url2); возвращает массив сотрудников. Измените editEmployees(id): Observable<{}> на editEmployees(id): Observable<Employee[]>, и проблема должна исчезнуть.
Спасибо за ваше время и поддержку. Проблема решена.
Я не вижу навигации по маршрутизатору. Как вы перешли к редактированию компонента?