Powiązanie wartości ze stylem


84

Próbuję powiązać właściwość koloru z mojej klasy (nabytą przez powiązanie atrybutu), aby ustawić background-colormoje div.

import {Component, Template} from 'angular2/angular2';

@Component({
  selector: 'circle',
  bind:{
    "color":"color"
  }
})
@Template({
  url: System.baseURL + "/components/circle/template.html",
})
export class Circle {
    constructor(){

    }

    changeBackground():string{
        return "background-color:" + this.color + ";";
    }
}

Mój szablon:

<style>
    .circle{
        width:50px;
        height: 50px;
        background-color: lightgreen;
        border-radius: 25px;
    }
</style>
<div class="circle" [style]="changeBackground()">
    <content></content>
</div>

Zastosowanie tego komponentu:

<circle color="teal"></circle>

Moje powiązanie nie działa, ale nie zgłasza też żadnych wyjątków.

Jeśli umieściłbym {{changeBackground()}}gdzieś w szablonie, zwróci to poprawny ciąg.

Dlaczego więc styl wiązania nie działa?

Jak też miałbym obserwować zmiany właściwości koloru wewnątrz Circleklasy? Jaki jest zamiennik

$scope.$watch("color", function(a,b,){});

w Angular 2?

Odpowiedzi:


108

Okazuje się, że nie działa wiązanie stylu ze stringiem. Rozwiązaniem byłoby związanie tła stylu.

 <div class="circle" [style.background]="color">

1
przegapiłeś cytat z alligator.io/angular/style-binding-ngstyle-angular <div class="circle" [style.background]="'color'">
Saad Benbouzid

1
Dla jasności: colorw tym przypadku jest to właściwość komponentu, która zawiera wartość, której chcesz użyć. Jeśli używasz cudzysłowów, to jest to wartość, której chcesz użyć. colornie jest prawidłowym kolorem CSS. Musiałoby to być coś podobnego [style.background] = "'#f3f3f3'".
SeanH

41

Od teraz (styczeń 2017 / Angular> 2.0) możesz używać następujących:

changeBackground(): any {
    return { 'background-color': this.color };
}

i

<div class="circle" [ngStyle]="changeBackground()">
    <!-- <content></content> --> <!-- content is now deprecated -->
    <ng-content><ng-content> <!-- Use ng-content instead -->
</div>

Najkrótsza droga wygląda prawdopodobnie tak:

<div class="circle" [ngStyle]="{ 'background-color': color }">
    <!-- <content></content> --> <!-- content is now deprecated -->
    <ng-content><ng-content> <!-- Use ng-content instead -->
</div>

23

Udało mi się to zrobić z alfą28 tak:

import {Component, View} from 'angular2/angular2';

@Component({
  selector: 'circle', 
  properties: ['color: color'],
})
@View({
    template: `<style>
    .circle{
        width:50px;
        height: 50px;
        border-radius: 25px;
    }
</style>
<div class="circle" [style.background-color]="changeBackground()">
    <content></content>
</div>
`
})
export class Circle {
    color;

    constructor(){
    }

    changeBackground(): string {
        return this.color;
    }
}

i tak to nazwał <circle color='yellow'></circle>


4
  • W swoim app.component.html użyj:

      [ngStyle]="{'background-color':backcolor}"
    
  • W app.ts deklarujemy zmienną typu string backcolor:string.

  • Ustaw zmienną this.backcolor="red".


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.