2016-03-14 8 views
11

Я знаю, что в Angular2 я могу добавить класс «красный» для элемента селектора компонента, делая это:Можно ли добавить динамический класс для размещения в Angular 2?

@Component({ 
    selector: 'selector-el', 
    host: { 
     '[class.red]': 'true' 
    }, 
    ... 
}) 

Я задаюсь вопросом, есть ли способ добавить динамический класс к хосту, подобно тому, что вы могли бы сделать с NgClass (я знаю NgClass это на самом деле не поддерживается, я ищу возможных решений):

@Component({ 
    selector: 'selector-el', 
    host: { 
     '[NgClass]': 'colorClass' 
    }, 
    ... 
}) 
... 
constructor(){ 
    this.colorClass = 'red'; 
} 
+0

Я действительно хотел добавить это редактирование к моему вопросу (не понимал, что я был на этом Q). Я не могу удалить свое редактирование. –

+0

@ Kudla69 без проблем, это было обработано. Вы можете добавить его к своему вопросу. –

ответ

12

вы можете использовать что-то вроде этого:

@Directive({ 
    (...) 
    host: { 
    '[class.className]' : 'className', 
    '[class]' : 'classNames' 
    } 
} 
export class MyDirective { 
    constructor() { 
    this.className = true; 
    this.classNames = 'class1 class2 class3'; 
    } 
} 
+0

Удивительный! Я полагаю, что это поддерживает и ngStyle? – kaiseroskilo

+0

Хотя это потрясающе, это уже не рекомендуемый подход https://angular.io/styleguide#style-06-03 –

5
import {Component, HostBinding} from 'angular2/core'; 

@Component({ 
    (...) 
} 

export class MyComponent { 
    @HostBinding('class') colorClass = 'red'; 
} 
+0

Как обновить переменную colorClass до некоторого другого значения, например 'blue' –

+0

@manpreetsingh Просто измените значение переменной , Например, 'this.colorClass =" blue ";' – oooyaya

16

Renderer s setElementClass может использоваться для добавления или удаления произвольного класса. Например md-[color] где color обеспечивается входом

<some-cmp [color]="red"> 
@Component({ 
// @Directive({ 
    selector: 'some-cmp', 
    template: '...' 
}) 
export class SomeComp { 
    color_: string; 

    @Input 
    set color() { 
     this.renderer.setElementClass(this.elementRef.nativeElement, 'md-' + this.color_, true); 
    } 

    get color(): string { 
     return this.color_; 
    } 

    constructor(public elementRef: ElementRef, private renderer: Renderer){} 
} 

Смотри также looking for nativeElement.classList.add() alternative

+0

Я хотел бы указать, что теперь вам нужно передать 'nativeElement' в средство визуализации, а не' ElementRef', для добавления класса. –

+0

@StefanRein благодарит за то, что указал на него - исправлено. –

0

Вы можете сделать следующее:

import {Component} from "@angular/core" 

@Component({ 
    selector: "[textbox]", 
    host: {"class": "first-class secondClass ThirdClass AnYClaSs"}, 
    template: ...            
}) 
export class MyComponent { } 

Который является имо путь более простым, чем введение Переменная.
Должен работать в Angular2 rc5, rc6, rc7, final. Может работать в более ранних версиях, но не пробовал.

+4

Оригинальный плакат искал ** динамическое ** назначение классов; это статично, верно? –

+0

Не полезно вообще, опять же, не динамично, как запрошено OP. – StinkyCat

6

Если вы хотите изменить его снаружи вы можете объединить @HostBinding и @Input():

@Component({ 
    selector: 'my-component', 
    template: `` 
}) 
export class MyComponent { 
    @HostBinding('class.your-class') @Input() isSelected: boolean; 
} 
+0

Удивительный. Единственный способ работать с изменениями, происходящими вне вашего компонента. Без @Input() изменения, сделанные вне, отражают только перезагрузку. – Brosig

5

Я достиг этого с помощью директивы как шаблон Service, а именно вручную предоставления NgClass и использовать его как (online demo):

const prefix = 'ant-btn' 

@Directive({ 
    selector: 'button[antBtn]', 
    providers: [ NgClass ], 
}) 
export class HelloComponent implements OnChanges { 
    @Input() color: string = 'default' 

    private hostClasses: { [name: string]: boolean } 

    constructor(@Self() private ngClass: NgClass) { } 

    ngOnChanges(changes: SimpleChanges): void { 
    this.hostClasses = { 
     [`${prefix}`]: true, 
     [`${prefix}-${this.color}`]: true, 
    } 

    this.updateHostClasses() 
    } 

    private updateHostClasses(): void { 
    this.ngClass.ngClass = this.hostClasses 
    this.ngClass.ngDoCheck() 
    } 
} 

Благодаря механизму DI, NgClass получит ElementRef текущего хост-элемента, модификатор Self() помогает его гарантировать. Таким образом, нет необходимости создавать экземпляр конструктором, тем самым все еще находясь в открытом доступе к API.

Это может быть более кратким в сочетании с наследованием класса, пример можно найти на here.

Смежные вопросы