Angular2中的ng-class

Mar*_*šak 34 typescript typescript1.5 angular

我正在开发一个角度为2的测试应用程序,我遇到了一个基于模型列表添加类的问题.

在Angular 1中,可以做到:

// model
$scope.myClasses = ['class1', 'class2', ...];

// view
... ng-class="myClasses" ...
Run Code Online (Sandbox Code Playgroud)

在Angular 2中,我迄今为止所做的就是:

// view
... [class.class1]="true" [class.class2]="true" ...
Run Code Online (Sandbox Code Playgroud)

这显然不是很有活力,我相信必须有更好的方法来做到这一点.

但是,我也尝试过:

// model
class ... {
    private myClasses: any;
    constructor() {
        this.myClasses = ['class1', 'class2', ...];
    }

// view
... [class]="myClasses" ...
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我尝试过myClasses单个类的字符串名称,字符串数组,带有类名键的对象和值作为值的true,这类对象的数组,但遗憾的是,列出的任何内容都不起作用这条路.

Mar*_*cok 39

根据NgClass API文档,Angular 2将接受字符串,数组或Object/map作为NgClass的表达式.或者,当然,您可以指定一个返回其中一个的函数.

import {Component, CORE_DIRECTIVES} from 'angular2/angular2'

@Component({
  selector: 'my-app',
  directives: [CORE_DIRECTIVES],
  template: `
    <div>
      <h2>{{title}}</h2>
      <div ngClass="gray-border purple">string of classes</div>
      <div [ngClass]="'gray-border purple'">string of classes</div>
      <div [ngClass]="['gray-border', 'green']">array of classes</div>
      <div [ngClass]="{'gray-border': true, 'blue': true}">object/map of classes</div>
      <button [ngClass]="{active: isActive}" (click)="isActive = !isActive">Click me</button>
    </div>
  `,
  styles: [`
    .gray-border {  border: 1px solid gray; }
    .blue   { color: blue; }
    .green  { color: green; }
    .purple { color: purple; }
    .active { background-color: #f55; }
  `]
})
export class App {
  title = "Angular 2 - NgClass";
  isActive = false;
}
Run Code Online (Sandbox Code Playgroud)

Plunker

如果要传递文字字符串,请注意两种替代语法:

<div ngClass="gray-border purple">string of classes</div>
<div [ngClass]="'gray-border purple'">string of classes</div>
Run Code Online (Sandbox Code Playgroud)

我相信第一个只是第二个语法糖.

并引用文档:

虽然NgClass指令可以解释求值为string,Array或Object的表达式,但基于对象的版本是最常用的,并且具有将所有CSS类名保留在模板中的优点.


ale*_*ods 33

你必须CSSClass在装饰者的directives财产中指定@View.看看这个插头.

@Component({
    selector: 'app',
})
@View({
    template: '<div [class]="classMap">Class Map</div>',
    directives: [CSSClass]
})
class App {
    constructor() {
        this.classMap = { 'class1': true, 'class2': false };

        setInterval(() => {
            this.classMap.class2 = !this.classMap.class2;
        }, 1000)
    }
}
Run Code Online (Sandbox Code Playgroud)

UPD

CSSClass NgClass在alpha-35中重命名为.看到这个插件

@Component({
  selector: 'app',
})
@View({
  directives: [NgClass],
  template: `
    <div [ng-class]="classMap">Class Map</div>
  `,
})
class App { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

  • CSSClass指令已重命名为NgClass. (2认同)

Ank*_*ngh 21

另一种方法 [使用三元算子和插值]

(Altough Mark Rajcok说明了所有可能的ngClass方法,但是你可以把它结合在一起ternary operator并得到else条件)


模板

<div class="hard-coded-class {{classCondition ? 'c1 c2': 'c3 c4'}}">
    Conditional classes using <b>Ternary Operator</b>
</div>
Run Code Online (Sandbox Code Playgroud)

或者使用ternary operator与ngClass,怎么看

TS

export class App {
  this.classCondition = false;
}
Run Code Online (Sandbox Code Playgroud)

结果

<div class="hard-coded-class c3 c4">
      Conditional classes using <b>Ternary Operator</b>
</div>
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.