【问题标题】:Cannot pass condition as boolean in Angular无法在 Angular 中将条件作为布尔值传递
【发布时间】:2021-05-20 00:57:46
【问题描述】:

我想尝试在字符串子句中传递条件,因为这些参数在目标组件中:

source.component:

export class TestComponent implements OnInit {
  condition: boolean;

  ngOnInit() {
    this.condition = !"element.id === 2";
  }
}

但是,我不能在目标组件中使用此条件:

target.component:

@Input() condition;


<button *ngIf="!condition" mat-menu-item (click)="openDialog(element)">Edit</button>

这里是这个问题的演示:

DEMO

我为什么不手动将这些参数添加到目标组件是因为;它是一个可重复使用的组件,另一个组件的条件可能不同。那么,如何从另一个组件传递条件?

看看

<button *ngIf="element.id % 2 === 0" mat-menu-item (click)="openDialog(element)">Edit</button>

我需要从另一个组件传递element.id % 2 === 0 部分而不是设置*ngIf="element.id % 2 === 0,例如条件:'element.id % 2 === 0'。然后我需要在这个组件中通过@Input 获得该选项。但我将它作为字符串接收,当我转换它时它总是返回 true :(

【问题讨论】:

    标签: javascript angular angular-material boolean components


    【解决方案1】:

    老实说,尝试将条件作为字符串传递是一种不好的方法。您应该尝试传递一个函数。

    TS:

    condition: (number) => boolean;
    
    ngOnInit() {
      this.condition = id => id % 2 === 0;
    }
    

    目标的 HTML

    <button *ngIf="!condition(element.id)" mat-menu-item (click)="openDialog(element)">Edit</button>
    

    查看Stackblitz

    更新:

    对于多个可选条件,最好实现OnChanges

    TS:

    options: Options[];
    
    ngOnInit() {
    
      this.options = [
        { id: 1, isTest: false },
        { id: 2, isTest: true },
        { id: 8, isTest: true }
      ];
    }
    

    目标的TS:

    ngOnChanges(changes: SimpleChanges): void {
      if (changes.options) {
        this.options.forEach(option => {
          const element = this.database.find(data=>data.id === option.id);
          if (element) element.isTest = option.isTest
        })
      }
    }
    

    目标的 HTML

    <button *ngIf="element.isTest" mat-menu-item (click)="openDialog(element)">Edit</button>
    

    Stackblitz

    【讨论】:

    • 您可以将任何数据传递给函数并实现您的条件逻辑。显示的方法 II 是一个数组,而不是一个条件。我无法理解您对方法 II 的需求。能解释一下方法二的使用吗
    • 每个按钮都会获得一个单独的条件。将单个元素项传递给条件。如果你展示你是如何实现你的按钮的,我可以提供帮助。
    • 据我了解,我发现您需要将条件作为单例传递,因此将条件更改为options[0].condition(element.isTest)。找到工作演示stackblitz.com/edit/…
    • 像魅力一样工作,非常感谢您的帮助...
    【解决方案2】:

    为此,您需要了解角度如何将表达式解析为字符串,

    它在内部使用eval('expression as string')

    我确实改变了 on init 如下

    源组件:

    export class TestComponent implements OnInit {
      condition: boolean;
    
      ngOnInit() {
        this.condition = "eval('!(element.id === 2)')";
      }
    }
    

    这是工作链接: Working Demo link

    【讨论】:

    • 对不起,我不能让你的演示工作。请检查一下好吗?
    • 我认为我的代码的问题与在数组中传递条件有关。那么,您能看看这个 NEW DEMO 吗?在这个演示中,方法 I 的工作方式非常棒,但是当通过传入数组转换参数时,方法 II 不起作用。我怎样才能让它在这个 NEW DEMO 中工作?
    • 不客气。如果您投票,我会很高兴,这样我就可以在某些行动中获得足够的声誉。谢谢。
    【解决方案3】:

    您可以像这样在target 组件中将您的条件作为函数传递。

    目标组件:

    condition: any;
    ngOnInit(){
       this.condition = (id: any): boolean => {
          return id !== 2;
       }
    }
    

    在你的target.component

    <button *ngIf="condition(element.id)" mat-menu-item (click)="openDialog(element)">Edit</button>
    

    Working Stackblitz

    因此,在此实现中,您将使您的代码更加安全。因为不推荐使用javascript eval,因为eval 可以执行其中的任何js 代码。所以黑客可以攻击那个区域。所以你可以实现上述解决方案。

    【讨论】:

    • 非常感谢您的帮助,但是当我尝试申请 stackblitz 时它不起作用。你能尝试在演示中应用它吗?也许我错过了一些要点。
    • @Natalia 请检查我的更新答案。我已经更新了我的解决方案
    【解决方案4】:

    你可以使用eval

    export class TestComponent implements OnInit {
      condition: string;
    
      ngOnInit() {
        this.condition = "eval('!(element.id === 2'))";
      }
    }

    【讨论】:

    • 我认为我的代码的问题与在数组中传递条件有关。那么,您能看看这个 NEW DEMO 吗?在这个演示中,方法 I 的工作方式非常棒,但是当通过传入数组转换参数时,方法 II 不起作用。我怎样才能使它在这个 NEW DEMO 中工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多