基于变量angular

时间:2017-09-05 05:23:28

标签: javascript css angular typescript angular2-template

我正在开发一个使用角度4开发的管理面板,并尝试集成一个部分来自定义样式,如更改颜色,bg等。 我已经开发了一个部分来保存数据库中的设置,使用API​​将它们作为json加载到应用程序上。

现在我正在尝试使用json中的值生成动态css,我尝试使用主要组件中的以下代码,但它无法正常工作

@Component({
      templateUrl: 'card.html',
      styles: [`
        .card {
          height: 70px;
          width: 100px;
          color: {{css.cardColor}};
        }
      `],
})

我不确定如何在组件中加载css值并在样式标记中使用它们。我没有找到任何其他解决方案。

另一种方法是使用角度动画概念,但css将是巨大的,并且不可能使用触发器和所有角度动画来实现它。我相信有一个解决方案,因为它似乎是一个真正的要求,应该由许多其他开发人员完成。

任何帮助都是值得的。

编辑:不能使用ngStyle作为几乎所有元素应用于整个应用程序,而不仅仅是特定元素。

7 个答案:

答案 0 :(得分:14)

你可以使用ngStyle从json中动态地将css添加到你的页面。

<div [ngStyle]="{'color': variable ? 'red' : 'blue'}"></div>

另一个例子可以是

 <div md-card-avatar [ngStyle]="{'background-image': 'url(' + post.avatar + ')', 'background-size': 'cover'  }"></div>

这里我已经加载了json的背景图片

答案 1 :(得分:12)

经过不同的方法并接近将动态css添加到角度应用程序的所有页面后,我最终得到了以下解决方案。

要求:根据返回的值和API生成动态css,以更改设计和样式。

解决方案:

  1. 创建一个新组件并创建一个服务以从API加载动态css变量。
  2. 在模板文件中添加样式标记,并为属性使用变量值。
  3. 在所有页面或主模板上加载此模板。
  4. 应用内部版本样式将移至头标记。
  5. 代码示例

    import { CssService} from './Css.service';
    
    @Component({
      selector: 'DynamicCss',
      templateUrl: './DynamicCss.component.html',
      styleUrls: ['./DynamicCss.component.scss']
    })
    export class ServiceProviderComponent implements OnInit {
        cssVariables: any;
        constructor(private cssService:CssService){
            /* call the service/api to get the css variable values in cssVariables */
    
        }
    }
    

    现在使用jquery或javascript应用css来附加css以及如下所示的函数

    appendCss(customData)
    {
         let text = '.custom-form-1 {
                background-image: url("`+customData.background_image+`");
             }';
         $(document).ready(function(){
             $("style").append(text);
          });
    }
    

    并在从服务或其他变量加载自定义数据后调用此函数,例如我ngOnInit

    ngOnInit(){
     this.appendCss(this.customizeFormData);
    }
    

    它使用jquery,但如果你不想在你的角应用程序中使用jquery,也可以用javascript / typescript完成

    其他有用资源https://github.com/angular/angular/issues/9343#issuecomment-312035896

答案 2 :(得分:5)

您只能绑定“style.color”

<div class="card" [style.color]=cardColor>lorem ipsum</div>

答案 3 :(得分:2)

ngClass用于设置变量值的动态类基础,如下所示

Ts File Component
     @Component ({
          selector:'simple-comp',
          template:`   <ol class="breadcrumb">
        <li *ngClass="{'active': step==='step1'}" (click)="step='step1; '">Step1</li>
        <li *ngClass="{'active': step==='step2'}"  (click)="step='step2'">Step2</li>
        <li *ngClass="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
       </ol>`
      })
    export class SimpleComponent {
    public step: string = 'step1'; // change value like step1, step2, step3
    }

angular.io的参考:https://angular.io/api/common/NgClass

<some-element [ngClass]="{'first': true, 'second': true, 'third': false}">...</some-element>

答案 4 :(得分:0)

我并不是说这是适用的,但是angular/flex-layout库对样式进行了很多操作。查看源代码可能会给您一些想法。

请记住利用指令,服务/依赖项注入。

例如,这是flex-layout库中一些有用的类,它们可能是相关的:

StyleUtilsStyleDirectiveMatchMedia(动态创建样式表标签)

答案 5 :(得分:0)

我想动态设置嵌套在组件中的元素的样式(特别是http://tb.github.io/ng2-nouislider/),因此与OP类似,ngStyle不适合。

我的方法是在模板(https://angular.io/api/core/ViewChild)中使用引用变量来访问组件的本机元素,并使用querySelector(https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector)查找目标子节点。

然后,将所需的样式应用于Renderer2。下面和在https://stackblitz.com/edit/angular-r3bs1d上的示例。

import { Component, Renderer2, ViewChild, AfterViewInit } from '@angular/core';

@Component({
    selector: 'my-app',
    templateUrl: './app.component.html',
    styleUrls: [ './app.component.css' ]
})

export class AppComponent implements AfterViewInit  {
    backgroundColour = '#ff0000';
    constructor(private renderer: Renderer2) { }
    @ViewChild('parent', { static: false }) parent;
    ngAfterViewInit(){
        this.renderer.setStyle(this.parent.nativeElement.querySelector('.child'), 'background', this.backgroundColour);
    }
}

HTML:

<div #parent>
    <div class="child">Child Element</div>
</div>

至少对于微小的样式更改,我认为这是一个可行的解决方案。

答案 6 :(得分:0)

对于背景使用,JSON方法用于颜色:

<ion-list-header class="background-size"
[ngStyle]="{'background-image': 'url(' + data.headerImage + ')'}"
*ngIf="data.headerImage != null">