Angular,新添加的item刷新后只能删除
Angular, the newly added item can only be deleted after refresh
我正在处理一个 Angular 12 项目,我正在使用 JSON-server 存储数据。
CRUD 操作运行良好。
但是当我使用表单添加新项目时,删除 和 更新 按钮将不起作用,除非我刷新页面。
This the error I get in the console,我点击删除按钮后,(没有刷新)。
product.service.ts
url = environment.url + 'products/';
constructor(private http: HttpClient) {}
getListProduct() {
return this.http.get<Product[]>(this.url);
}
addProduct(product: Product) {
return this.http.post(this.url, product);
}
deleteProduct(id: string) {
return this.http.delete(this.url + id);
}
updateProduct(product: Product) {
return this.http.put(this.url + product.id, product);
}
}
主要-product.component.ts
export class MainProductComponent implements OnInit {
inputProduct: Product = new Product();
isForm: Boolean = false;
buttonString: String = 'Add New Product';
listProduct: Product[] = [];
constructor(private productService: ProductService) {}
ngOnInit(): void {
this.productService
.getListProduct()
.subscribe((data: Product[]) => (this.listProduct = data));
}
changePage() {
this.isForm = !this.isForm;
if (this.isForm) {
this.buttonString = 'Go Back To List';
} else {
this.inputProduct = new Product();
this.buttonString = 'Add New Product';
}
}
deleteProduct(p: Product) {
let i = this.listProduct.indexOf(p);
this.productService
.deleteProduct(p.id)
.subscribe(() => this.listProduct.splice(i, 1));
}
saveProduct(product: Product) {
let i = this.listProduct.indexOf(product);
if (i != -1) {
//update a product
this.productService
.updateProduct(product)
.subscribe(() => (this.listProduct[i] = product));
} else {
//add a new product
this.productService.addProduct(product).subscribe(
() => this.listProduct.push(product),
() => console.log('error')
);
}
this.isForm = false;
this.buttonString = 'Add New Product';
this.inputProduct = new Product();
}
updateProduct(p: Product) {
this.isForm = true;
this.inputProduct = p;
}
表格-product.component.ts
export class FormProductComponent implements OnInit {
selectedFile = null;
private product!: Product;
productForm!: FormGroup;
@Input() updateProduct!: Product;
@Output() addEvent = new EventEmitter<Product>();
constructor(private builder: FormBuilder) {}
ngOnInit(): void {
if (this.updateProduct === null) {
this.product = new Product();
} else {
this.product = this.updateProduct;
}
this.productForm = this.builder.group({
title: [
this.product.libelle,
[Validators.required, Validators.minLength(3)],
],
price: [
this.product.prixUnitaire,
[Validators.required, Validators.min(10)],
],
photo: [this.product.photo, Validators.required],
category: [this.product.categorie, Validators.required],
});
}
upload(event: any) {
this.selectedFile = event.target.files[0].name;
console.log(this.selectedFile);
}
addProduct() {
this.product.libelle = this.productForm.value.title;
this.product.prixUnitaire = this.productForm.value.price;
this.product.photo = String(this.selectedFile);
this.product.categorie = this.productForm.value.category;
this.addEvent.emit(this.product);
}
}
这有点难说,但看起来你没有在前端的数组中保存来自创建的响应。
最有可能的代码应该如下
// add a new product
this.productService.addProduct(product).subscribe(
newProduct => this.listProduct.push(newProduct),
() => console.log('error')
);
我把上面的内容写在我的 phone 上,这里有一个更详细的答案。
我以前从未使用过 json-server
,所以我对此一无所知。从他们的文档中,在他们的示例中,他们在将对象发送到 json 服务器之前在对象上创建 id。我看不到你的产品 class 所以我不知道你是否正在为你的对象生成一个 ID...我猜不是。
这种情况最常见的工作流程是,前端会创建一个没有 id 的对象,将其发送到后端,后端会将其保存在某种数据存储中。该过程还为该对象生成 id,并且 returns 它作为 create 调用中对象的一部分。然后,前端能够通过 id(get、put、delete 等)对该对象执行进一步的操作。
在您的代码中,您没有获取后端返回的对象并将其推送到数组中,而是将要发送到后端的对象推送到数组中。同样,在没有 id 的典型场景中。
如果 json-server 要求您创建和分配 ID,那么您需要更新您的产品 class 以便在产品更新时分配 ID。
你必须从数组中获取产品的逻辑是有效的,因为你得到的错误不是它找不到 'id of undefined',而是代码正在寻找产品,但 id 属性 该产品对象未定义。
同样,通常该 id 来自后端,如果发生在此处,那么您将不会得到它,因为您没有将来自后端的对象添加到数组中。如果 json-server 要求您将 id 传递给它,那么您将需要更新您的前端代码以生成 id 然后一切都应该为您工作。
peinearydevelopment 是对的。您也可以在添加或删除后重新获取列表。 (如果你想运行一些计算和查询或设置一些服务器端排序到列表)
类似于:
constructor(private productService: ProductService) {}
ngOnInit(): void {
this.fetchList(); // This Line
}
fetchList() { // This Function
this.productService
.getListProduct()
.subscribe((data: Product[]) => (this.listProduct = data));
}
deleteProduct(p: Product) {
let i = this.listProduct.indexOf(p);
this.productService
.deleteProduct(p.id)
.subscribe(() => {
this.fetchList(); // This Line
});
}
saveProduct(product: Product) {
let i = this.listProduct.indexOf(product);
if (i != -1) {
//update a product
this.productService
.updateProduct(product)
.subscribe(() => (this.listProduct[i] = product));
} else {
//add a new product
this.productService.addProduct(product).subscribe(() => {
this.fetchList(); // This Line
}, () => console.log('error'));
}
this.isForm = false;
this.buttonString = 'Add New Product';
this.inputProduct = new Product();
}
我正在处理一个 Angular 12 项目,我正在使用 JSON-server 存储数据。 CRUD 操作运行良好。
但是当我使用表单添加新项目时,删除 和 更新 按钮将不起作用,除非我刷新页面。
This the error I get in the console,我点击删除按钮后,(没有刷新)。
product.service.ts
url = environment.url + 'products/';
constructor(private http: HttpClient) {}
getListProduct() {
return this.http.get<Product[]>(this.url);
}
addProduct(product: Product) {
return this.http.post(this.url, product);
}
deleteProduct(id: string) {
return this.http.delete(this.url + id);
}
updateProduct(product: Product) {
return this.http.put(this.url + product.id, product);
}
}
主要-product.component.ts
export class MainProductComponent implements OnInit {
inputProduct: Product = new Product();
isForm: Boolean = false;
buttonString: String = 'Add New Product';
listProduct: Product[] = [];
constructor(private productService: ProductService) {}
ngOnInit(): void {
this.productService
.getListProduct()
.subscribe((data: Product[]) => (this.listProduct = data));
}
changePage() {
this.isForm = !this.isForm;
if (this.isForm) {
this.buttonString = 'Go Back To List';
} else {
this.inputProduct = new Product();
this.buttonString = 'Add New Product';
}
}
deleteProduct(p: Product) {
let i = this.listProduct.indexOf(p);
this.productService
.deleteProduct(p.id)
.subscribe(() => this.listProduct.splice(i, 1));
}
saveProduct(product: Product) {
let i = this.listProduct.indexOf(product);
if (i != -1) {
//update a product
this.productService
.updateProduct(product)
.subscribe(() => (this.listProduct[i] = product));
} else {
//add a new product
this.productService.addProduct(product).subscribe(
() => this.listProduct.push(product),
() => console.log('error')
);
}
this.isForm = false;
this.buttonString = 'Add New Product';
this.inputProduct = new Product();
}
updateProduct(p: Product) {
this.isForm = true;
this.inputProduct = p;
}
表格-product.component.ts
export class FormProductComponent implements OnInit {
selectedFile = null;
private product!: Product;
productForm!: FormGroup;
@Input() updateProduct!: Product;
@Output() addEvent = new EventEmitter<Product>();
constructor(private builder: FormBuilder) {}
ngOnInit(): void {
if (this.updateProduct === null) {
this.product = new Product();
} else {
this.product = this.updateProduct;
}
this.productForm = this.builder.group({
title: [
this.product.libelle,
[Validators.required, Validators.minLength(3)],
],
price: [
this.product.prixUnitaire,
[Validators.required, Validators.min(10)],
],
photo: [this.product.photo, Validators.required],
category: [this.product.categorie, Validators.required],
});
}
upload(event: any) {
this.selectedFile = event.target.files[0].name;
console.log(this.selectedFile);
}
addProduct() {
this.product.libelle = this.productForm.value.title;
this.product.prixUnitaire = this.productForm.value.price;
this.product.photo = String(this.selectedFile);
this.product.categorie = this.productForm.value.category;
this.addEvent.emit(this.product);
}
}
这有点难说,但看起来你没有在前端的数组中保存来自创建的响应。
最有可能的代码应该如下
// add a new product
this.productService.addProduct(product).subscribe(
newProduct => this.listProduct.push(newProduct),
() => console.log('error')
);
我把上面的内容写在我的 phone 上,这里有一个更详细的答案。
我以前从未使用过 json-server
,所以我对此一无所知。从他们的文档中,在他们的示例中,他们在将对象发送到 json 服务器之前在对象上创建 id。我看不到你的产品 class 所以我不知道你是否正在为你的对象生成一个 ID...我猜不是。
这种情况最常见的工作流程是,前端会创建一个没有 id 的对象,将其发送到后端,后端会将其保存在某种数据存储中。该过程还为该对象生成 id,并且 returns 它作为 create 调用中对象的一部分。然后,前端能够通过 id(get、put、delete 等)对该对象执行进一步的操作。
在您的代码中,您没有获取后端返回的对象并将其推送到数组中,而是将要发送到后端的对象推送到数组中。同样,在没有 id 的典型场景中。
如果 json-server 要求您创建和分配 ID,那么您需要更新您的产品 class 以便在产品更新时分配 ID。
你必须从数组中获取产品的逻辑是有效的,因为你得到的错误不是它找不到 'id of undefined',而是代码正在寻找产品,但 id 属性 该产品对象未定义。
同样,通常该 id 来自后端,如果发生在此处,那么您将不会得到它,因为您没有将来自后端的对象添加到数组中。如果 json-server 要求您将 id 传递给它,那么您将需要更新您的前端代码以生成 id 然后一切都应该为您工作。
peinearydevelopment 是对的。您也可以在添加或删除后重新获取列表。 (如果你想运行一些计算和查询或设置一些服务器端排序到列表)
类似于:
constructor(private productService: ProductService) {}
ngOnInit(): void {
this.fetchList(); // This Line
}
fetchList() { // This Function
this.productService
.getListProduct()
.subscribe((data: Product[]) => (this.listProduct = data));
}
deleteProduct(p: Product) {
let i = this.listProduct.indexOf(p);
this.productService
.deleteProduct(p.id)
.subscribe(() => {
this.fetchList(); // This Line
});
}
saveProduct(product: Product) {
let i = this.listProduct.indexOf(product);
if (i != -1) {
//update a product
this.productService
.updateProduct(product)
.subscribe(() => (this.listProduct[i] = product));
} else {
//add a new product
this.productService.addProduct(product).subscribe(() => {
this.fetchList(); // This Line
}, () => console.log('error'));
}
this.isForm = false;
this.buttonString = 'Add New Product';
this.inputProduct = new Product();
}