Angular Lifecycle Interface OnChanges 应该为方法 ngOnChanges 实现
Posted
技术标签:
【中文标题】Angular Lifecycle Interface OnChanges 应该为方法 ngOnChanges 实现【英文标题】:Angular Lifecycle Interface OnChanges should be implemented for method ngOnChanges 【发布时间】:2021-10-04 07:51:22 【问题描述】:Tslint 正在发送一个警告,指出应该为方法 ngOnChagnes
生命周期挂钩实现 OnChanges
。如果我将ngOnChanges
更改为OnChanges
,则警告不存在。
import Component, Input, OnInit, Output, EventEmitter, SimpleChange, OnChanges from '@angular/core';
import Order from '../../../../core/orders';
import CartItem from '../../../../core/orders';
import User from '../../../../core/auth/_models/user.model';
declare var $: any;
@Component(
selector: 'app-order-summary',
templateUrl: './order-summary.component.html',
styleUrls: ['./order-summary.component.scss']
)
export class OrderSummaryComponent implements OnInit, OnChanges
@Input() cartDetails: Order;
@Input() sellerDetail: User;
@Input() productCost: number;
@Output() closeOrderSummary = new EventEmitter<string>();
@Output() checkoutCart = new EventEmitter<string>();
@Output() updateItemQty = new EventEmitter<string>();
@Output() updateProductSelected = new EventEmitter<string>();
cartList: CartItem[] = [];
isCartEmpty: boolean;
constructor()
ngOnChanges(changes: SimpleChange)
for (const propName in changes)
if (propName === 'cartDetails')
const change = changes[propName];
this.cartList = change.currentValue;
this.isCartEmpty = (change.currentValue.length === 0);
ngOnInit(): void
onUpdateItemCount(item, direc)
const payload = item, direc ;
this.updateItemQty.emit(payload);
onUpdateProductSelected(value, item)
const payload = value, item;
this.updateProductSelected.emit(payload);
goBackToMain()
this.closeOrderSummary.emit();
onCheckoutCart()
this.checkoutCart.emit();
【问题讨论】:
【参考方案1】:implements OnInit, OnChanges
不见了。每当您使用 Angular 生命周期钩子时,您还应该将相应的 implements 接口添加到控制器类。
【讨论】:
我已将 Onchanges 添加到实现接口中,并在上面的代码中进行了更新。现在我得到“属性'ngOnChagnes'int类型'OrderSummaryComponent'不可分配给基本类型'OnChanges'中的相同属性 在我将界面从 SimpleChange 更改为 SimpleChanges 之后,它就可以工作了。非常感谢。 这不是真的。我目前找不到该文档,但接口仅用于指导(如命名和语法)。没有实现接口implements OnChanges
的函数 ngOnChanges()
将完全被 Angular 接受为生命周期钩子。
@MichaelD 这就是为什么我写了“应该”而不是“必须” - 是的,没有接口,Angular 完全没问题,因为 Angular 是在运行时评估的,而 TS 已经被转译了。然而,这是您必须进行的最佳实践和默认设置 - 因此您应该。它还有助于防止其他错误,正如您在 Amar 之前的评论中可以立即看到的那样;)我正在简化答案,因为我认为有必要匹配 OP 的范围并抽象出不需要的细节。【参考方案2】:
OnChanges
接口中声明的ngOnChanges()
函数的参数接受SimpleChanges
类型的参数,而不是SimpleChange
。正如其他答案的评论中所提到的,在不实现 OnChanges
接口的情况下使用函数 ngOnChanges()
也将被 Angular 接受为生命周期钩子。但是您收到的类型错误不会被抛出,这可能会导致其他问题。
import Component, Input, OnInit, Output, EventEmitter, SimpleChanges, OnChanges from '@angular/core';
ngOnChanges(changes: SimpleChanges)
...
【讨论】:
感谢您的信息。这确实帮助我理解了这个问题。 这并没有解决最初的问题。当 TSLint 告诉您应该实现 OnChanges 这就是您应该做的(或更改 TSLint 配置)时 - 所述也是这里的一个问题,但不是 OP 最初要求的问题 :) @PatrickKelleter:现在我知道问题出在哪里了。在原始问题中,OP 没有实现OnChanges
接口。这就是你所看到的,你的答案解决了这个问题。然而不久之后,OP 包含了OnChanges
接口。这就是我在回答中看到并解决的问题。
@MichaelD 哦,我知道你是对的,感谢您指出这一点。 @AmarShakya 调整您的问题代码以适应解决方案并不是一个好主意,因为它会改变帖子的动态,并且会使后来的访问者感到困惑,而不是帮助:)以上是关于Angular Lifecycle Interface OnChanges 应该为方法 ngOnChanges 实现的主要内容,如果未能解决你的问题,请参考以下文章
Nativescript Angular Lifecycle 挂钩未将 css 类应用于动态组件
Flutter 返回 `lifecycle-common-java8.jar (androidx.lifecycle:lifecycle-common-java8:2.0.0)` 错误
2022-10-02:以下go语言代码能否通过编译?A: 能;B: 不能;C: 不知道。 package main import ( “fmt“ ) type worker interfa
Jasmine 测试中 AfterViewInit 的生命周期钩子
我们啥时候应该使用 android.arch.lifecycle:compiler(或 android.arch.lifecycle:common-java8)?