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?

user1613512
źródło

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">
user1613512
źródło
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>
andreas
źródło
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>

kakaja
źródło
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".

manish kunal
źródło
2

Próbować [attr.style]="changeBackground()"

matsko
źródło