【问题标题】:Angular ngStyle Dynamic Styling Element with ngIf使用 ngIf 的 Angular ngStyle 动态样式元素
【发布时间】:2020-10-05 09:17:30
【问题描述】:

我正在开发应用服务器身份验证和数据库搜索引擎中的动态样式元素功能。

searchNoResult 时,UI 为:

当点击按钮触发execSearch()事件->searchSuccess为真,模板searchSuccessColor生效(文本背景颜色变为粉红色)。 但是,我似乎无法获得动态样式的颜色:

我尝试将模板设置如下,但不起作用:

<button class="button" 
    [disabled] = "!enableSearch"
    (click) = "execSearch()">Search State</button>
    <div *ngIf = "searchSuccess; then searchSuccessColor else searchNoResult"></div>
<ng-template #searchNoResult>
    <p>{{ stateSearchResult }}</p>
</ng-template>
<ng-template #searchSuccessColor>
    <div [ngStyle]="{backgroundColor: 'pink'}"></div>
        <p>{{ stateSearchResult }}</p>
</ng-template>

我厌倦了下面的组件方法但不起作用:

  setColor() {
    return this.searchSuccess === true ? 'pink' : 'black';
  }

有人可以帮助找出问题所在吗?

【问题讨论】:

    标签: javascript angular styling angular-directive angular-template


    【解决方案1】:

    如果 else 块仅用于为背景着色,则可以使用 [style.background-color] 和三元运算符完全跳过它。试试下面的

    <div [style.background-color]="searchSuccess ? 'pink' : ''"><p>{{ stateSearchResult }}</p></div>
    

    或者如果你想使用ngStyle(可能包含更多样式),那就是

    <div [ngStyle]="{'background-color': searchSuccess ? 'pink' : ''}"><p>{{ stateSearchResult }}</p></div>
    

    或者您也可以使用 ngClass 有条件地包含 CSS 选择器。

    app.component.css

    .highlight {
      background-color: pink;
    }
    

    app.component.html

    <div [ngClass]="{highlight: searchSuccess}"><p>{{ stateSearchResult }}</p></div>
    

    更新:使用控制器中定义的变量

    如果您不想硬编码颜色值,您可以尝试在控制器中定义一个变量来保存颜色值。

    控制器

    export class AppComponent implements OnInit {
      backgroundColor = 'pink';
    
      // button `click` event handler
      execSearch() {
        ...
        this.backgroundColor = searchSuccess ? 'pink' : 'black';
      }
    }
    

    模板

    <div [style.background-color]="backgroundColor">
      <p>{{ stateSearchResult }}</p>
    </div>
    
    <div [ngStyle]="{'background-color': backgroundColor}">
      <p>{{ stateSearchResult }}</p>
    </div>
    

    请注意此处backgroundColor 周围缺少单引号。它表示控制器中的变量。像'pink' 这样的单引号值表示字符串文字。

    ngClass

    CSS

    .highlight-pink {
      background-color: pink;
    }
    
    .highlight-black {
      background-color: black;
      color: white;
    }
    

    模板

    <div [ngClass]="searchSuccess ? 'highlight-pink' : 'highlight-black'">
      <p>{{ stateSearchResult }}</p>
    </div>
    

    【讨论】:

    • 工作!让我们更加面向对象:
    • 我将硬编码的pink 替换为setColor() 方法为&lt;button class="button" [disabled] = "!enableSearch" (click) = "execSearch()"&gt;Search State&lt;/button&gt; &lt;div [style.background-color]="searchSuccess ? setColor() : ''"&gt;&lt;p&gt;{{ stateSearchResult }}&lt;/p&gt;&lt;/div&gt;。如何删除 [style.background-color] ?我试过[ngStyle],但颜色又熄灭了。我想混淆模板的内容。我该怎么做?
    • 如果您不控制更改检测策略,请尽量不要在事件绑定中调用 setColor() 之类的函数。尽管有任何混淆,用户始终可以在浏览器控制台调试器中看到源代码。
    • @FionaChen:我已经更新了使用控制器变量的答案。
    • 谢谢!控制样式的最佳做法是什么,例如fontsizecolorposition...等?
    猜你喜欢
    • 2019-04-30
    • 2021-09-12
    • 2020-02-07
    • 2017-07-10
    • 2020-07-14
    • 2018-03-02
    • 2017-07-16
    • 2018-11-27
    • 2018-05-02
    相关资源
    最近更新 更多