我想把一个对象传递给子组件。我已经做了一切,但什么都不起作用。(ANGULAR)
我想把一个对象传递给子组件。我已经做了一切,但什么都不起作用。(ANGULAR)
这是父组件:我将所有数据从父组件传递给了主页面组件。
import { Component, OnInit } from '@angular/core'; import { Product } from '../Model/Product'; import { ProductService } from '../ProductsService/product.service'; @Component({ selector: 'app-parent', templateUrl: './parent.component.html', styleUrls: ['./parent.component.css'], }) export class ParentComponent implements OnInit { products: Product[] = []; cartList: Product[] = []; constructor(private productService: ProductService) { this.products = this.productService.getProducts(); } ngOnInit(): void {} addCart(product: Product) { this.cartList.push(product); } }
(模板)
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { ProductService } from '../../ProductsService/product.service'; import { Product } from '../../Model/Product'; @Component({ selector: 'app-main-page', templateUrl: './main-page.component.html', styleUrls: ['./main-page.component.css'], }) export class MainPageComponent { @Input() products: Product[] = []; @Output() addCart: EventEmitter= new EventEmitter(); constructor(private productService: ProductService) { this.products = this.productService.getProducts(); } addToCartList(product: Product) { this.addCart.emit(product); } }
(模板)
正如您注意到的,这里有一个点击按钮,我通过将该方法发送到父组件,以便将其值传递给另一个子组件。
Document
- {{ product.name }}
- {{ product.type }}
- {{ product.available }}
- {{ product.price }}
import { Component, Input, OnInit } from '@angular/core'; import { Product } from 'src/app/Model/Product'; @Component({ selector: 'app-cart-list', templateUrl: './cart-list.component.html', styleUrls: ['./cart-list.component.css'], }) export class CartListComponent implements OnInit { constructor() { console.log(this.cartList); } @Input() cartList: Product[] = []; ngOnInit(): void {} }
为什么我无法使用cartList中的任何值?
问题的原因是作者试图将一个对象传递给一个子组件,但是尝试了各种方法都没有成功。解决方法是使用一个服务来在组件之间进行数据通信。
首先,作者建议创建一个名为CartService的服务。在这个服务中,创建一个名为cart$的BehaviorSubject,用来存储购物车中的商品列表。然后,添加一个add方法,用来向购物车中添加商品,并使用pipe操作符和take(1)操作符来确保只订阅一次。最后,添加一个clear方法,用来清空购物车。
在购物车组件中,将cart$属性指定为CartService中的cart$属性。然后,在视图中使用*ngFor指令遍历cart$属性,并使用async管道来处理异步数据。
在产品组件中,将addToCartList函数改为调用CartService的add方法来添加商品到购物车。
最后,另一个开发者提到了一些关于使用BehaviorSubject的问题,并建议使用Subject来代替。他还提到了将Subject作为Observable暴露给组件监听变化的最佳实践。
总结起来,通过创建一个服务来进行组件间的数据通信,可以解决作者遇到的问题。这种方法可以确保数据的一致性,并且遵循RxJs的最佳实践。
在Angular中,有一个问题是当我们尝试将对象传递给子组件时,子组件中的对象始终为空。这是因为组件的输入是在组件初始化期间设置的,而构造函数在此之前执行。因此,如果要检查 cartList
是否被正确设置,应该在 OnInit
钩子中将其打印出来。
为了解决这个问题,可以在 CartListComponent
中使用一个 setter 来打印出值。此外,当尝试向购物车添加一个项目时,可能会出现组件无法正确重新渲染的情况,这是因为 Angular 在比较引用而不是值时检测变化。所以当执行 this.cartList.push(product)
时,实际上并没有改变数组的引用,而是改变了其值。为了解决这个问题,可以尝试将一个全新的数组赋值给变量,将旧数组复制过来。
然而,更好的解决方法是创建一个 CartService
,将购物车的逻辑集中到一个地方,而不是试图创建一个混乱的父子组件之间的通信。通过创建一个 CartService
,可以简化所有操作,并将购物车的逻辑集中到一个地方。
首先,在 CartService
中创建一个 BehaviorSubject,用于保存购物车的状态。然后,在组件中注入并使用该服务。通过使用 cartService.cart$
可以获取到购物车项目的列表,通过 cartService.addToCart(item)
可以将物品添加到购物车中。
以上就是解决这个问题的原因和方法。通过将逻辑集中到一个地方,我们可以简化代码并解决组件间通信的问题。
在这个问题中,原因是没有正确地将对象传递给子组件。解决方法是使用一个简单的Angular服务来处理传递对象的需求。
首先,我们创建一个名为ProductService的服务来模拟应用程序,该服务返回一个Product数组,其中每个产品都有一个名字。
接下来,我们创建一个名为CartService的服务来存储购物车列表项,并提供添加和删除功能。
然后,我们创建一个名为MainPageComponent的组件,它通过ProductService获取产品,并可以将产品添加到购物车中。
最后,我们创建一个名为CartListComponent的组件,它显示购物车中的产品,并可以从购物车中删除产品。
通过使用这些服务和组件,我们可以在父组件中实例化其他组件,并正确地传递对象给子组件。
这是解决该问题的完整代码。