Динамическое обновление css в Angular 2
допустим, у меня есть компонент Angular2
//home.component.ts
import { Component } from 'angular2/core';
@Component({
selector: "home",
templateUrl: "app/components/templates/home.component.html",
styleUrls: ["app/components/styles/home.component.css"]
})
export class HomeComponent {
public width: Number;
public height: Number;
}
HTML-файл шаблона для этого компонента
//home.component.html
<div class="home-component">Some stuff in this div</div>
и, наконец, css-файл для этого компонента
//home.component.css
.home-component{
background-color: red;
width: 50px;
height: 50px;
}
как вы можете видеть есть 2 свойства в классе, width и height. Я хотел бы, чтобы стили css для width и height соответствовали значениям свойств width и height и когда свойства обновляются, ширина и высота обновления div. Каков правильный способ добиться этого?
9 ответов:
попробуй такое
<div class="home-component" [style.width.px]="width" [style.height.px]="height">Some stuff in this div</div>[обновляется]: Для установки в % use
[style.height.%]="height">Some stuff in this div</div>
чтобы использовать % вместо px или em с ответом @Gaurav, это просто
<div class="home-component" [style.width.%]="80" [style.height.%]="95"> Some stuff in this div</div>
Это должно сделать это:
<div class="home-component" [style.width]="width + 'px'" [style.height]="height + 'px'">Some stuff in this div</div>
вы также можете использовать hostbinding:
import { HostBinding } from '@angular/core'; export class HomeComponent { @HostBinding('style.width') width: Number; @HostBinding('style.height') height: Number; }теперь при изменении свойства width или height из HomeComponent это должно повлиять на атрибуты стиля.
import {Component,bind} from 'angular2/core'; import {bootstrap} from 'angular2/platform/browser'; import {FORM_DIRECTIVES} from 'angular2/form'; import {Directive, ElementRef, Renderer, Input,ViewChild,AfterViewInit} from 'angular2/core'; @Component({ selector: 'my-app', template: ` <style> .myStyle{ width:200px; height:100px; border:1px solid; margin-top:20px; background:gray; text-align:center; } </style> <div [class.myStyle]="my" [style.background-color]="randomColor" [style.width]="width+'px'" [style.height]="height+'px'"> my width={{width}} & height={{height}}</div> `, directives: [] }) export class AppComponent { my:boolean=true; width:number=200px; height:number=100px; randomColor; randomNumber; intervalId; textArray = [ 'blue', 'green', 'yellow', 'orange', 'pink' ]; constructor() { this.start(); } start() { this.randomNumber = Math.floor(Math.random()*this.textArray.length); this.randomColor=this.textArray[this.randomNumber]; console.log('start' + this.randomNumber); this.intervalId = setInterval(()=>{ this.width=this.width+20; this.height=this.height+10; console.log(this.width +" "+ this.height) if(this.width==300) { this.stop(); } }, 1000); } stop() { console.log('stop'); clearInterval(this.intervalId); this.width=200; this.height=100; this.start(); } } bootstrap(AppComponent, []);
вы можете динамически изменять стиль (ширину и высоту) div, прикрепляя динамическое значение к inline [style.ширина] и [стиль.hiegh] свойство div.
в вашем случае вы можете привязать свойство width и height класса HomeComponent с помощью встроенного свойства width и height стиля div... по указанию Sasxa
<div class="home-component" [style.width]="width + 'px'" [style.height]="height + 'px'">Some stuff in this div </div>для рабочей демонстрации взгляните на это plunker(http://plnkr.co/edit/cUbbo2?p=preview)
//our root app component import {Component} from 'angular2/core'; import {FORM_DIRECTIVES,FormBuilder,AbstractControl,ControlGroup,} from "angular2/common"; @Component({ selector: 'home', providers: [], template: ` <div class="home-component" [style.width]="width+'px'" [style.height]="height+'px'">Some this div</div> <br/> <form [ngFormModel]="testForm"> width:<input type="number" [ngFormControl]="txtWidth"/> <br> Height:<input type="number"[ngFormControl]="txtHeight" /> </form> `, styles:[` .home-component{ background-color: red; width: 50px; height: 50px; } `], directives: [FORM_DIRECTIVES] }) export class App { testForm:ControlGroup; public width: Number; public height: Number; public txtWidth:AbstractControl; public txtHeight:AbstractControl; constructor(private _fb:FormBuilder) { this.testForm=_fb.group({ 'txtWidth':['50'], 'txtHeight':['50'] }); this.txtWidth=this.testForm.controls['txtWidth']; this.txtHeight=this.testForm.controls['txtHeight']; this.txtWidth.valueChanges.subscribe(val=>this.width=val); this.txtHeight.valueChanges.subscribe(val=>this.height =val); } }
все вышеперечисленные ответы являются большими. Но если вы пытаетесь найти решение, которое не изменит html-файлы ниже, это полезно
ngAfterViewChecked(){ this.renderer.setElementStyle(targetItem.nativeElement, 'height', textHeight+"px"); }вы можете импортировать рендерер из
import {Renderer} from '@angular/core';
мне понравился внешний вид WenhaoWuIидея выше, но мне нужно было идентифицировать div с класс ".ui-дерево " в компонент дерева PrimeNG для динамической установки высоты. Все ответы, которые я мог найти, требовали, чтобы div был назван (т. е. #treediv), чтобы включить использование @ViewChild (), @Viewchild (), @ContentChild (), @ContentChilden() и т. д. Это было грязно с компонентом третьей стороны.
Я, наконец, нашел фрагмент из Гюнтер Он:
ngAfterViewInit() { this.elRef.nativeElement.querySelector('.myClass'); }Я:
@Input() height: number; treeheight: number = 400; //default value constructor(private renderer: Renderer2, private elRef: ElementRef) { } ngOnInit() { this.loading = true; if (this.height != null) { this.treeheight = this.height; } } ngAfterViewInit() { this.renderer.setStyle(this.elRef.nativeElement.querySelector('.ui-tree'), 'height', this.treeheight + "px"); }
принятый ответ не является неправильным.
для сгруппированных стилей можно также использовать директиву ngStyle.
<some-element [ngStyle]="{'font-style': styleExpression, 'font-weight': 12}">...</some-element>официальные документы здесь
Comments