我有一个父组件(CategoryComponent)、一个子组件(videoListComponent)和一个ApiService.

我的大部分工作都很好,即每个组件都可以访问json api,并通过可观测数据获取相关数据.

目前视频列表组件只是得到所有的视频,我想过滤这只是一个特定类别的视频,我通过@Input()传递给子元素的CategoryID实现了这一点.

CategoryComponent.html

<video-list *ngIf="category" [categoryId]="category.id"></video-list>

这是可行的,当父CategoryComponent类别更改时,CategoryID值通过@Input()传递,但我随后需要在VideoListComponent中检测到这一点,并通过APIService(使用新的CategoryID)重新请求视频array.

在AngularJS中,我会对变量进行$watch分.最好的处理方法是什么?

推荐答案

Actually, there are two ways of detecting and acting upon when an input changes in the child component in angular2+ :

  1. 您可以使用旧答案中提到的ngOnChanges() lifecycle method:
    @Input() categoryId: string;
        
    ngOnChanges(changes: SimpleChanges) {
        
        this.doSomething(changes.categoryId.currentValue);
        // You can also use categoryId.previousValue and 
        // categoryId.firstChange for comparing old and new values
        
    }
    

Documentation Links: ngOnChanges, SimpleChanges, SimpleChange
Demo Example: Look at this plunker

  1. 或者,您也可以使用input property setter,如下所示:
    private _categoryId: string;
    
    @Input() set categoryId(value: string) {
    
       this._categoryId = value;
       this.doSomething(this._categoryId);
    
    }
    
    get categoryId(): string {
    
        return this._categoryId;
    
    }

文档链接:查看here.

演示示例:看this plunker.

WHICH APPROACH SHOULD YOU USE?

如果您的组件有多个输入,那么如果您使用ngOnChanges(),您将在ngOnChanges()中一次获得所有输入的所有更改.使用此方法,您还可以比较已更改的输入的当前值和以前的值,并采取相应的操作.

然而,如果您只想在某个特定的单一输入发生更改时执行某些操作(并且不关心其他输入),那么使用输入属性设置器可能会更简单.然而,这种方法并没有提供一种内置的方法来比较更改输入的先前值和当前值(使用ngOnChanges lifecycle方法可以很容易地做到这一点).

EDIT 2017-07-25: ANGULAR CHANGE DETECTION MAY STILL NOT FIRE UNDER SOME CIRCUMSTANCES

通常,每当父组件更改传递给子组件provided that the data is a JS primitive datatype(string, number, boolean)的数据时,setter和ngOnChanges的更改检测都会触发.但是,在以下情况下,它不会启动,您必须采取额外的措施才能使其工作.

  1. 如果您使用嵌套对象或数组(而不是JS基元数据类型)将数据从父级传递到子级,则可能不会触发更改检测(使用setter或ngchange),这在user:muetzerich的回答中也有提到.要获得解决方案,请查看here个.

  2. 如果在angular上下文之外(即外部)对数据进行变异,angular将不知道这些变化.您可能必须在组件中使用ChangeDetectorRef或NgZone,以了解外部变化,从而触发变化检测.参考this.

Angular相关问答推荐

Angular 动画-每次点击时都让迪夫向右移动一定程度

Angular 信号不更新afterNextender()

如何跨不同组件使用ng模板

导致无限请求的Angular HttpInterceptor和HttpClientModule

Angular中的Bootstrap carousel动态属性

我们应该在Angular 从14升级到15的过程中也升级茉莉花和业力相关的依赖吗?

如何重新显示ngbAlert(Bootstrap widgest for Angular)消息后再次驳回它

筛选器不会从文本输入触发更改事件

从Angular 前端访问ASP.NET Core 8 Web API时出现CORS错误

Angular 应用程序未在Azure应用程序服务中运行

Angel Project Build从Angel 8升级后,从12MB增加到90MB

Angular 16模块中未使用的组件是否从Bundle 包中删除(树摇动)?

自定义垫日历中选定的日期(Angular material )

由于ngcc操作失败,Angular扩展可能无法正常工作

大型 Angular 12 应用程序 - 我如何管理 js 文件

Angular 测试被认为是成功的,即使有错误

Angular 2:Validators.pattern() 不工作

将查询参数附加到 URL

实现自定义 NgbDateParserFormatter 来更改 NgbInputDatepicker 上输入值的格式是否正确?

如何从materialAngular使用分页器?