当前位置: 首页 > 知识库问答 >
问题:

如何检测@input()值的角度变化?

濮阳安澜
2023-03-14

我有一个父组件(CategoryComponent)、一个子组件(videoListComponent)和一个APIService。

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

当前video list组件只获取所有视频,我想将其筛选为特定类别中的视频,我通过@input()将categoryId传递给子对象实现了这一点。

CategoryComponent.html

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

这样可以工作,当父CategoryComponent类别更改时,categoryId值将通过@input()传递,但我需要在VideoListComponent中检测到这一点,并通过APIService(使用新的categoryId)重新请求Video数组。

在AngularJS中,我会对变量执行$watch。处理这件事最好的方法是什么?

共有2个答案

袁宜民
2023-03-14

组件中使用ngonchanges()生命周期方法。

在检查数据绑定属性之后,如果至少有一个属性发生了更改,则在检查视图和内容子项之前调用ngOnChanges。

这是文件。

朱啸
2023-03-14

实际上,当Angular2+中的子组件中的输入发生变化时,有两种方法可以检测和执行:

  1. 您可以使用ngOnChanges()生命周期方法,如旧答案中所述:
    @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
        
    }
    

文档链接:ngOnChanges,SimpleChanges,simplechange
演示示例:看这个柱塞

    private _categoryId: string;
    
    @Input() set categoryId(value: string) {
    
       this._categoryId = value;
       this.doSomething(this._categoryId);
    
    }
    
    get categoryId(): string {
    
        return this._categoryId;
    
    }

文档链接:看这里。

演示示例:看看这个柱塞。

你应该使用哪种方法?

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

但是,如果您想在只有特定的单个输入更改时执行某些操作(而您不关心其他输入),那么使用输入属性设置器可能会更简单。但是,这种方法没有提供一种内置的方式来比较更改的输入的以前值和当前值(您可以通过ngOnChanges生命周期方法轻松地完成这一操作)。

编辑2017-07-25:角度变化探测在某些情况下仍可能不开火

通常情况下,只要父组件更改它传递给子组件的数据,那么setter和ngOnChanges的更改检测都将触发,前提是数据是JS基元数据类型(字符串、数字、布尔)。但是,在下面的场景中,它不会开火,您必须采取额外的操作才能使它工作。

>

  • 如果使用嵌套对象或数组(而不是JS基元数据类型)将数据从父级传递到子级,则更改检测(使用setter或ngchanges)可能不会触发,正如用户muetzerich的回答中所述。如需解决方案,请参阅此处。

    如果您在angular上下文之外(即外部)更改数据,那么angular将不知道更改。您可能必须在组件中使用ChangeDetectorRef或NgZone来对外部更改进行角度感知,从而触发更改检测。请参阅此。

  •  类似资料:
    • 问题内容: 我有一个使用ajax请求检索对象数组的父组件。 该组件有两个子组件:一个子组件以树结构显示对象,另一个子组件以表格格式呈现其内容。父级通过@input属性将数组传递给其子级,它们会正确显示内容。一切都如预期。 当您更改对象内的某些字段时,会发生问题:子组件不会收到有关这些更改的通知。仅当您手动将数组重新分配给它的变量时,才会触发更改。 我已经习惯了使用Knockout JS,并且需要获

    • 我正在编写一个具有属性的角度组件。 我希望能够以编程方式设置此属性,而不是响应任何事件。 问题是在没有浏览器事件的情况下,模板绑定不会更新。 是否有办法手动触发此更改检测?

    • 我们将创建一个简单的来显示一个电影的信息。 这个应用程序将只包含两个组件:MovieComponent显示有关电影的信息和MainComponent,它使用按钮来保存对电影的引用以执行一些动作。 我们的AppComponent组件将有三个属性:应用程序的slogan,电影的title(标题)和(主角)。 最后两个属性将被传递到模板中引用的MovieComponent元素。 在上面的代码片段中,我们

    • 问题内容: 有什么方法可以在python中每次变量值更改时调用函数? 像听众一样吗? 具体来说,我指的 是 像GAE-Session这样的脚本之间 仅共享变量 的情况 。(使用Cookie,Memcache等共享数据) 示例:ScriptA和ScriptB,共享一个会话变量。当脚本B进行更改时,SctiptA必须调用一个方法来处理该更改。 问题答案: 使用属性。首先,可变值可以更改。

    • 问题内容: 如何轻松检测变量何时更改值?我希望每当指定变量更改值时,程序的执行就在调试器上中断。现在,我正在使用Eclipse的调试器。 问题答案: 对于类或实例变量 右键单击大纲视图中的变量 选择“切换监视点” 然后,在breapkoints视图中,可以右键单击结果条目 选择“断点属性” 取消选择“现场访问”。

    • 我有一个角度组件,它有一个输入< code>Person 在这个组件的父组件中,如果我替换了作为子组件输入的对象,