Angular 6指令属性不会动态变化

Posted

技术标签:

【中文标题】Angular 6指令属性不会动态变化【英文标题】:Angular 6 directive attribute not changing dynamically 【发布时间】:2019-11-09 13:05:09 【问题描述】:

我有一个组件A,页面上有自定义指令:

查看:

<warning [details]='details'></warning>

组件:

    export class AComponent implements OnInit 
      details: ConfirmDetails = 
        header_class: ""   
      ;
      languageChanged(newLang: string) 
        this.currentLanguage = newLang;
        this.ngOnInit();
      
     ngOnInit() 
       if (this.currentLanguage === "English")
          this.details.header_class = "line1 font50";
       
       else
         this.details.header_class = "line2 font90";
       
    

一旦调用languageChanged(),指令就不会更新。

    export class WarningComponent implements OnInit 
      @Input() details: ConfirmDetails;

      ngOnInit() 
           console.log(this.details.header_class);
       
    

所以在加载details 的第一页输入是“line1 font50”,但是当 languageChanged() 调用它不会改变,所以我没有看到任何控制台输出。

我将不胜感激。

【问题讨论】:

ngOnInit 仅在“元素”附加到 DOOM 时执行(如果您有,例如 *ngIf="toogle",则每次切换变为 true)。但变量确实发生了变化。要进行测试,请在您的 alert.html 中添加一些 details,或使用 setter ***.com/questions/36653678/… 【参考方案1】:

ngOnInit 在组件第一次初始化时被调用一次。如果您想捕获对@Input 的进一步更改,您需要使用ngOnChanges 挂钩。但是,在复杂类型(对象、数组)上,如果对象/数组引用发生更改,将调用ngOnChanges,如果对象字段更改或数组元素更改,则不会调用它。

如果您希望在每次调用 languageChanged() 时捕获更改,请执行以下操作;

AComponent

  ngOnInit() 
    // clones the object with a brand new reference
    const tmpDetails = JSON.parse(JSON.stringify(this.details));
    if (this.currentLanguage === "English") 
      tmpDetails.header_class = "line1 font50";
    
    else 
      tmpDetails.header_class = "line2 font90";
    
    this.details = tmpDetails;
  

WarningComponent

export class WarningComponent implements OnChanges  
  @Input() details: any;

  ngOnChanges() 
    console.log("details:", this.details);
  

这是一个工作演示https://stackblitz.com/edit/angular-yhv8qq

【讨论】:

以上是关于Angular 6指令属性不会动态变化的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 Angular 2 反应/动态表单的一个元素发生的变化?

Angular Grid ag-grid columnDefs 动态变化

动态更改 Angular 指令元素属性

Swift iOS 应用程序 - 静态分配具有动态变化行的表属性

为指令属性传递动态值获取未定义的Angular5

Angular 1.6.4如何检测组件的无绑定属性的变化[重复]