【问题标题】:Apply ng-class conditionally有条件地应用 ng-class
【发布时间】:2016-02-27 19:37:08
【问题描述】:

我正在根据某些条件显示图像(即,如果满足条件 1,则显示图像 1,如果满足条件 2,则显示图像 2,依此类推)。 我正在使用ng-if。我的代码如下所示:

<div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left"
     ng-if="data.severity==3">
        <img src="App/images/Icons/alarm-high.png">
</div>
<div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left"
     ng-if="data.severity==2">
        <img src="App/images/Icons/alarm-medium.png">
</div>
<div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left"
     ng-if="data.severity==1">
        <img src="App/images/Icons/alarm-low.png">
</div>

我只显示了 1 张图片,但我仍然需要编写 3 行代码。 这里如何使用ng-class,尽量减少写代码?

【问题讨论】:

    标签: javascript html css angularjs twitter-bootstrap


    【解决方案1】:

    使用ng-src来动态改变图片的src,那么你只需要代码一次:)

    <div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left"> 
        <img ng-src="{{img.src}}"> 
    </div>
    

    内部控制器:

    if($scope.data.severity == 2){
        $scope.img.src = 'App/images/Icons/alarm-medium.png';
    } else if($scope.data.severity==1){
        $scope.img.src = 'App/images/Icons/alarm-low.png';
    }
    

    编辑

    正如 cmets 中所指出的,如果在页面上使用多个,这将不起作用。所以这里有一个替代方案。

    <div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left"> 
        <img ng-src="{{ getSeverity(data.severity) }}"> 
    </div>
    

    -

    $scope.getSeverity = function(severity){
        if(severity == 2){
             return 'App/images/Icons/alarm-medium.png';
        } else if(severity == 1){
             return 'App/images/Icons/alarm-low.png';
        }
    }
    

    -

    作为引导代码的题外话,作为建议,您实际上可能会在 div 上丢失很多类。特别是 col-sm-1 及以上。 col-xs-1 将适用于 sm/md/lg。

    <div class="col-xs-1 form-col-pad customization-grid-data text-left"> 
    

    【讨论】:

    • 你已经为 data.severity==2 设置了两个条件
    • 已编辑。至少无论如何,总的想法是存在的:)
    • 这只有在页面上只有一张图片时才有效。如果包含两个或多个data,它们都将获得相同的图像(最后一个)。此外,如果data.severity 发生变化,除非您再次在控制器中明确设置,否则图像不会更改。
    • @Arg0n - 我觉得我的回答特别适合那个问题。然而,我已经更新了我的答案以包含一个可以处理多个图像的不同选项:)
    【解决方案2】:

    HTML

    <div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left">
            <img ng-src="{{'App/images/Icons/alarm-' + (data.severity == 1 ? 'low' : (data.severity == 2 ? 'medium' : 'high')) + '.png'}}">
    </div>
    

    HTML

    <div class="col-xs-1 col-sm-1 col-md-1 col-lg-1 form-col-pad customization-grid-data text-left">
            <img ng-src="{{getSeveritySrc(data)}}">
    </div>
    

    控制器中的 JavaScript

    $scope.getSeveritySrc = function(data){
        var src = 'App/images/Icons/alarm-';
        switch(data.severity){
            case 1:
                src += 'low';
            break;
            case 2:
                src += 'medium';
            break;
            default:
                src += 'high';
            break;
        }
        src += '.png';
        return src;
    }
    

    HTML 中的属性

    ng-class="{'low':data.severity == 1,'medium':data.severity == 2,'high':data.severity == 3}"
    

    示例 CSS

    .low {
        background: green;
    }
    
    .medium {
        background: yellow;
    }
    
    .high {
        background: red;
    }
    

    HTML 中的属性

    ng-class="getSeverityClass(data)"
    

    控制器中的 JavaScript

    $scope.getSeverityClass = function(data){
        switch(data.severity){
            case 1:
                return 'low';
            break;
            case 2:
                return 'medium';
            break;
            default:
                return 'high';
            break;
        } 
    }
    

    还有一个JSFiddle 来展示这个与多个data 一起使用。

    【讨论】:

    • 我没有将 img src=" " 放入我的代码中,而是创建了具有图像 url(背景:url)的类。在我的控制器中,我放置了一个条件,[如果严重性 = 3(则 class= "high","severity=2,class="medium",etc.)] 并将该类名分配给一个变量,并在我的 html 中使用 {{}} 应用了该类。这对我很有用。如果有什么可以建议HTML 为:
      if(severity===3){ aClassName = "high"; } else if(severity===2){ aClassName = "medium"; }
    • @HarpreetChawla 我已经更新了我的答案以使用ng-class
    • 您的 ng-class 方法运行良好,但是在查看页面的 DOM 时(使用检查元素),它会暴露条件(即,如果严重性 = 3,则 class= 高),即一个不好的做法。这就是为什么我更喜欢使用上面提到的方式
    • 看看这个:jsfiddle.net/Arg0n/njx9w003/3 ng-class 使用函数(在顶部)。没有曝光。
    • 顺便说一句,无论哪种情况,用户都可以查看您的 JavaScript 并了解它是如何计算的。
    【解决方案3】:

    另一种选择是使用 ng-switch:

    <span ng-switch on="data.severity">
       <img ng-switch-when="1" src='App/images/Icons/alarm-low.png'>
       <img ng-switch-when="2" src='App/images/Icons/alarm-medium.png'>
       <img ng-switch-when="3" src='App/images/Icons/alarm-high.png'>
       <img ng-switch-default   src='default image source'>
    </span>
    

    【讨论】:

    • 根本不知道这个存在!
    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多