Привязка значения к стилю


84

Я пытаюсь связать свойство цвета из моего класса (полученное путем привязки атрибута), чтобы установить значение background-colormy 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 + ";";
    }
}

Мой шаблон:

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

Использование этого компонента:

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

Моя привязка не работает, но и исключений не возникает.

Если бы я поместил {{changeBackground()}}где-нибудь в шаблоне, это вернет правильную строку.

Так почему же привязка стилей не работает?

Кроме того, как мне наблюдать за изменениями свойства цвета внутри Circleкласса? Какая замена

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

в Angular 2?

Ответы:


108

Оказывается, привязка стиля к строке не работает. Решением было бы привязать фон стиля.

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

1
вы пропустили цитату из alligator.io/angular/style-binding-ngstyle-angular <div class="circle" [style.background]="'color'">
Саад Бенбузид

1
Для ясности: colorв данном случае это свойство вашего компонента, которое содержит значение, которое вы хотите использовать. Если вы используете кавычки, это значение, которое вы хотите использовать. colorнедопустимый цвет CSS. Это должно быть что-то вроде [style.background] = "'#f3f3f3'".
SeanH

41

На данный момент (январь 2017 г. / Angular> 2.0) вы можете использовать следующее:

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

и

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

Самый короткий путь, наверное, такой:

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

23

Мне удалось заставить его работать с alpha28 вот так:

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;
    }
}

и назвал это так <circle color='yellow'></circle>


4
  • В вашем app.component.html используйте:

      [ngStyle]="{'background-color':backcolor}"
    
  • В app.ts объявить переменную строкового типа backcolor:string.

  • Установите переменную this.backcolor="red".


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.