Angular 2:将函数传递给模板上的ngClass标记

Mat*_*abb 8 typescript angular

我已经对此做了一些搜索,但没有发现任何有用的东西.

当我将函数传递给ngStyle时,我得到以下错误:

Expression 'getClass()' in ProductView has changed after it was checked.

我的模板看起来像:

<div class="itemContainer">
    <div class="well imageHolder" [ngClass]="getClass()">
        <img [src]="'img/thumbs/' + item.images[0]" class="productImage" id="productImage">
    </div>
</div> 
Run Code Online (Sandbox Code Playgroud)

我不知道什么会解决这个问题,即使目前可以做到这一点.我注意到ngStyle也会出现这个错误.

所有帮助将不胜感激.

Mar*_*cok 10

属性绑定使用以下语法:[someProperty]="an Angular template expression".

在您的情况下,模板表达式是一个函数(而不是组件属性).没关系.但是根据模板语法开发指南的"表达指南"部分,表达式必须是"幂等的".这意味着,如果

expression返回一个字符串或一个数字,当连续两次调用时,它返回相同的字符串或数字.如果表达式返回一个对象(包括一个DateArray),则在连续两次调用时返回相同的对象引用.

由于您没有为您的getClass()函数提供代码,我们只是假设它违反了幂等规则.(您可能每次都返回一个新数组或一个新对象.)

在开发模式(默认模式)中,更改检测运行两次,它将捕获幂等违规.

要解决此问题,请返回相同的数组或对象引用(但您可以修改数组内容或对象属性/值).例如,

export class MyComponent {
   anArray = [];
   getClass() {
      // manipulate (don't reassign) anArray here, and return it
      return this.anArray;
   }
}
Run Code Online (Sandbox Code Playgroud)


Lia*_*nat 9

答案很简单,您可以使用函数执行此操作,只需确保函数将返回类名称

在HTML上:

<div [ngClass]="getClassByValue('a')"> My Div</div>
Run Code Online (Sandbox Code Playgroud)

在ts文件上:

  getClassByValue(value: string) {
    switch (value) {
      case "a": return "class-a";
      case "b": return "class-b";
    }
  }
Run Code Online (Sandbox Code Playgroud)

最终将在您的元素上使用类名"class-a".

希望能帮助到你 :)