ChatGPT解决这个技术问题 Extra ChatGPT

有条件地申请课程的最佳方式是什么?

假设您有一个在 ul 中呈现的数组,其中每个元素都有一个 li,控制器上有一个名为 selectedIndex 的属性。在 AngularJS 中使用索引 selectedIndex 将类添加到 li 的最佳方法是什么?

我目前正在(手动)复制 li 代码并将类添加到 li 标记之一,并使用 ng-showng-hide 每个索引仅显示一个 li

这个问题的答案表明模板比 {{varname}} 更多。我在哪里可以找到有关模板的更多内容的文档,例如几种不同形式的三元运算符?除了 {{varname.fieldname}} 之外,docs.angularjs.org/guide/templates 似乎没有解释模板在条件等方面提供了什么。
这对我来说非常有用,希望它对你有用tech-blog.maddyzone.com/javascript/…

o
orcun

如果您不想像我一样将 CSS 类名放入 Controller 中,这是我在 v1 之前使用的一个老技巧。我们可以编写一个直接计算所选类名的表达式,不需要自定义指令:

ng:class="{true:'selected', false:''}[$index==selectedIndex]"

请注意带有冒号的旧语法。

还有一种更好的有条件地应用类的新方法,例如:

ng-class="{selected: $index==selectedIndex}"

Angular 现在支持返回对象的表达式。该对象的每个属性(名称)现在都被视为一个类名,并根据其值应用。

然而,这些方式在功能上并不相同。这是一个例子:

ng-class="{admin:'enabled', moderator:'disabled', '':'hidden'}[user.role]"

因此,我们可以通过基本上将模型属性映射到类名来重用现有的 CSS 类,同时将 CSS 类排除在控制器代码之外。


OP,这可能是我见过的表达三元运算符的最糟糕的方式。你考虑过 ($index==selectedIndex) ? 'selected' : '' 吗?
@Malvolio AFAIR,三元运算符不在 v0.9.x 的角度表达式中工作。这或多或少是一个开关。
ng-class(截至 2012 年 1 月 19 日)现在支持一个表达式,该表达式必须计算为 1)以空格分隔的类名字符串,或 2)和类名数组,或 3)类的映射/对象名称为布尔值。所以,使用 3): ng-class="{selected: $index==selectedIndex}"
谢谢@Mark,顺便说一句,既然我已经检查过了,我可以说这种方法在 v1 中有效。在某些情况下它仍然有用。请注意,对象属性名称(键)不一定是真或假,它可以是您可能想要映射到类名的任何内容。
我只是想补充一下,我遇到了一个问题,因为我使用的是 {classname: '$index === selectedIndex'} 之类的语法,但它不起作用。当我将所有内容放在一起并使用 == 而不是 === 时,它起作用了。 {classname: '$index==selectedIndex'}
C
Community

ng-class 支持必须计算为

以空格分隔的类名字符串,或类名数组,或类名到布尔值的映射/对象。

因此,使用表格 3) 我们可以简单地写

ng-class="{'selected': $index==selectedIndex}"

另请参阅 How do I conditionally apply CSS styles in AngularJS? 以获得更广泛的答案。

更新:Angular 1.1.5 增加了对 ternary operator 的支持,因此如果您更熟悉该结构:

ng-class="($index==selectedIndex) ? 'selected' : ''"

+1 三元运算符(我现在需要一个),但 1.1.* 是一个“不稳定版本”,API 如有更改,恕不另行通知 - 截至键入时。 1.0.* 是稳定的,所以对于下周推出为期 6 个月的项目,我会更放心。
ng-class="{'selected': $index==selectedIndex}" 适合我
s
skmvasu

我最喜欢的方法是使用三元表达式。

ng-class="condition ? 'trueClass' : 'falseClass'"

注意:如果你使用的是旧版本的 Angular,你应该改用它,

ng-class="condition && 'trueClass' || 'falseClass'"

这帮助我编写了这个表达式:ng-class="property.name=='timestamp' ? 'property-timestamp' : 'property-'+{{$index}}"。想不出其他办法。
我真的不知道为什么我的作用域布尔 modalFlag 没有更新 - ng-class="{'closed': modalFlag , 'open':!modalFlag}" 我试图根据作用域变量/布尔值添加关闭或打开- 如果有人可以提供帮助,我将非常感激 - 谢谢。
这是作为 1.5 版本引入的。 github.com/angular/angular.js/commit/…
s
stefano

我会补充一点,因为其中一些答案似乎已经过时了。这是我的做法:

<class="ng-class:isSelected">

其中“isSelected”是在作用域角度控制器中定义的 javascript 变量。为了更具体地解决您的问题,您可以使用以下方法生成列表:

HTML

<div ng-controller="ListCtrl">  
    <li class="ng-class:item.isSelected" ng-repeat="item in list">   
       {{item.name}}
    </li>  
</div>

JS

function ListCtrl($scope) {    
    $scope.list = [  
        {"name": "Item 1", "isSelected": "active"},  
        {"name": "Item 2", "isSelected": ""}
    ]
}


请参阅:http://jsfiddle.net/tTfWM/

请参阅:http://docs.angularjs.org/api/ng.directive:ngClass


class="ng-class:item.isSelected" 和 ng-class="item.isSelected" 有什么不同
对使用 ng-class:className 与仅使用 class="{{className}}" 感到好奇吗?
佚名

这是一个更简单的解决方案:

函数 MyControl($scope){ $scope.values = ["a","b","c","d","e","f"]; $scope.selectedIndex = -1; $scope.toggleSelect = function(ind){ if( ind === $scope.selectedIndex ){ $scope.selectedIndex = -1; } 其他{ $scope.selectedIndex = ind; } } $scope.getClass = function(ind){ if( ind === $scope.selectedIndex ){ return "selected"; } 其他 { 返回 ""; } } $scope.getButtonLabel = function(ind){ if( ind === $scope.selectedIndex ){ return "取消选择"; } else{ 返回“选择”; } } } .selected { 颜色:红色; }

  • {{value}}

选中:{{selectedIndex}}


我强烈建议您的控制器远离 CSS 内容。那是你不想走的路。
类名属于模板
在某些时候,jsfiddle 可能会错过支付账单,或者选择转移到另一个域,或者负责任的人被公共汽车杀死(另见 Bus Factor)。那么我可以请你在你的回答中解释那个小提琴的作用吗?这也是堆栈溢出的规范。
L
Lèse majesté

我最近遇到了类似的问题,并决定只创建一个条件过滤器:

  angular.module('myFilters', []).
    /**
     * "if" filter
     * Simple filter useful for conditionally applying CSS classes and decouple
     * view from controller 
     */
    filter('if', function() {
      return function(input, value) {
        if (typeof(input) === 'string') {
          input = [input, ''];
        }
        return value? input[0] : input[1];
      };
    });

它接受一个参数,可以是 2 元素数组或字符串,它会变成一个数组,并附加一个空字符串作为第二个元素:

<li ng-repeat="item in products | filter:search | orderBy:orderProp |
  page:pageNum:pageLength" ng-class="'opened'|if:isOpen(item)">
  ...
</li>

我刚刚创建了一个 yesNo() 过滤器,根据布尔值 1 o 0 返回类“yes”或“no”:filter('yesNo', function() { return function(input) { // info('yesNo('+ input +')'); switch(input){ case '1': return ' yes '; break; default: return ' no '; break; } } });
ng-class 可以处理类名到布尔值的映射/对象,因此您可以简单地编写以下内容: ng-class="{yes: some_boolean_expression, no: some_other_boolean_expression}" 例如,ng-class="{yes: input ,不:!输入}“
J
Joe Steele

如果您想超越二进制评估并将 CSS 排除在控制器之外,您可以实现一个简单的过滤器,根据地图对象评估输入:

angular.module('myApp.filters, [])
  .filter('switch', function () { 
      return function (input, map) {
          return map[input] || '';
      }; 
  });

这使您可以像这样编写标记:

<div ng-class="muppets.star|switch:{'Kermit':'green', 'Miss Piggy': 'pink', 'Animal': 'loud'}">
    ...
</div>

嗨@Joe,任何想法如何处理空值?如果我在输入中传入null,它不会映射它的类......
@ user1191559 - 您可以在地图中添加一个“默认”项目,然后在“输入”为空时返回该值。
P
Pytth

我最近做的就是这样做:

<input type="password"  placeholder="Enter your password"
ng-class="{true: 'form-control isActive', false: 'isNotActive'}[isShowing]">

isShowing 值是位于我的控制器上的值,通过单击按钮进行切换,单括号之间的部分是我在我的 css 文件中创建的类。

编辑:我还想补充一点,codeschool.com 有一个免费的课程,由谷歌在 AngularJS 上赞助,它涵盖了所有这些东西,然后是一些。无需支付任何费用,只需注册一个帐户即可开始!祝大家好运!


你能在这里提供一个小提琴或更多代码吗? isShowing 是控制器中的一个数组吗?
l
lionroots

三元运算符 has just been1.1.5 中添加到角度解析器。

所以现在最简单的方法是:

ng:class="($index==selectedIndex)? 'selected' : ''"

另外:class="otherClass ng-class:($index==selectedIndex)? 'selected' : '';"
e
erier

我们可以创建一个函数来管理有条件的返回类

https://i.stack.imgur.com/h4sic.jpg

<script>
    angular.module('myapp', [])
            .controller('ExampleController', ['$scope', function ($scope) {
                $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray'];
                $scope.getClass = function (strValue) {
                    switch(strValue) {
                        case "It is Red":return "Red";break;
                        case "It is Yellow":return "Yellow";break;
                        case "It is Blue":return "Blue";break;
                        case "It is Green":return "Green";break;
                        case "It is Gray":return "Gray";break;
                    }
                }
        }]);
</script>

接着

<body ng-app="myapp" ng-controller="ExampleController">

<h2>AngularJS ng-class if example</h2>
<ul >
    <li ng-repeat="icolor in MyColors" >
        <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p>
    </li>
</ul>
<hr/>
<p>Other way using : ng-class="{'class1' : expression1, 'class2' : expression2,'class3':expression2,...}"</p>
<ul>
    <li ng-repeat="icolor in MyColors">
        <p ng-class="{'Red':icolor=='It is Red','Yellow':icolor=='It is Yellow','Blue':icolor=='It is Blue','Green':icolor=='It is Green','Gray':icolor=='It is Gray'}" class="b">{{icolor}}</p>
    </li>
</ul>

您可以参考 ng-class if example 处的完整代码页


R
Ravi Ram

我是 Angular 的新手,但发现这可以解决我的问题:

<i class="icon-download" ng-click="showDetails = ! showDetails" ng-class="{'icon-upload': showDetails}"></i>

这将有条件地应用基于 var 的类。它以 icon-download 作为默认值开始,使用 ng-class,我检查 showDetails 的状态 if true/false 并应用类 icon-upload .它工作得很好。

希望能帮助到你。


D
Daniel B

这就像一个魅力;)

<ul class="nav nav-pills" ng-init="selectedType = 'return'">
    <li role="presentation" ng-class="{'active':selectedType === 'return'}"
        ng-click="selectedType = 'return'"><a href="#return">return

    </a></li>
    <li role="presentation" ng-class="{'active':selectedType === 'oneway'}"
        ng-click="selectedType = 'oneway'"><a href="#oneway">oneway
    </a></li>
</ul>

s
sundar

这可能会被遗忘,但这是我使用 1.1.5 的三元运算符根据表中的一行是第一行、中间行还是最后一行来切换类的方式——除非表中只有一行:

<span class="attribute-row" ng-class="(restaurant.Attributes.length === 1) || ($first ? 'attribute-first-row': false || $middle ? 'attribute-middle-row': false || $last ? 'attribute-last-row': false)">
</span>

B
Ben Kalsky

这是我工作中的多重条件判断:

<li ng-repeat='eOption in exam.examOptions' ng-class="exam.examTitle.ANSWER_COM==exam.examTitle.RIGHT_ANSWER?(eOption.eoSequence==exam.examTitle.ANSWER_COM?'right':''):eOption.eoSequence==exam.examTitle.ANSWER_COM?'wrong':eOption.eoSequence==exam.examTitle.RIGHT_ANSWER?'right':''">
  <strong>{{eOption.eoSequence}}</strong> &nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;
  <span ng-bind-html="eOption.eoName | to_trusted">2020 元</span>
</li>

A
Ashley Davis

这是另一个在无法使用 ng-class 时效果很好的选项(例如在设置 SVG 样式时):

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

(我认为您需要使用最新的不稳定 Angular 才能使用 ng-attr-,我目前使用的是 1.1.4)


S
Sheelpriy

好吧,我建议您使用返回 true 或 false 的函数检查控制器中的条件。

<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>

并在您的控制器中检查条件

$scope.getTodayForHighLight = function(today, date){
return (today == date);
}

G
George Kagan

部分的

  <div class="col-md-4 text-right">
      <a ng-class="campaign_range === 'thismonth' ? 'btn btn-blue' :  'btn btn-link'" href="#" ng-click='change_range("thismonth")'>This Month</a>
      <a ng-class="campaign_range === 'all' ? 'btn btn-blue' :  'btn btn-link'" href="#" ng-click='change_range("all")'>All Time</a>
  </div>

控制器

  $scope.campaign_range = "all";
  $scope.change_range = function(range) { 
        if (range === "all")
        {
            $scope.campaign_range = "all"
        }
        else
        {  
            $scope.campaign_range = "thismonth"
        }
  };

S
Scotty.NET

如果您使用的是 angular pre v1.1.5(即没有三元运算符)并且您仍然想要在两种情况下设置值的等效方法,您可以执行以下操作:

ng-class="{'class1':item.isReadOnly == false, 'class2':item.isReadOnly == true}"

l
lars1595

如果您有一个应用于许多元素的通用类,您可以创建一个自定义指令,该指令将添加该类,如 ng-show/ng-hide。

如果单击该指令,该指令会将“活动”类添加到按钮

module.directive('ngActive',  ['$animate', function($animate) {
  return function(scope, element, attr) {
    scope.$watch(attr.ngActive, function ngActiveWatchAction(value){
      $animate[value ? 'addClass' : 'removeClass'](element, 'active');
    });
  };
}]);

更多信息


R
Robert Green MBA

经过大量搜索,今天刚刚添加了一些对我有用的东西......

<div class="form-group" ng-class="{true: 'has-error'}[ctrl.submitted && myForm.myField.$error.required]">

希望这有助于您的成功发展。

=)

Undocumented Expression Syntax : Great Website Link... =)


查看接受的答案。它正在做同样的事情,并给出了更多的例子。
A
Arsen Khachaturyan

检查this

臭名昭著的 AngularJS if|else 语句!!!
当我开始使用 Angularjs 时,我有点惊讶我找不到 if/else 语句。

所以我正在做一个项目,我注意到在使用 if/else 语句时,加载时会显示条件。你可以使用 ng-cloak 来解决这个问题。

<div class="ng-cloak">
 <p ng-show="statement">Show this line</span>
 <p ng-hide="statement">Show this line instead</span>
</div>

.ng-cloak { display: none }

谢谢阿马杜


T
Tushar Sharma

您可以使用 this npm 包。它处理所有事情,并具有基于变量或函数的静态和条件类的选项。

// Support for string arguments
getClassNames('class1', 'class2');

// support for Object
getClassNames({class1: true, class2 : false});

// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], { 
    class5 : function() { return false; },
    class6 : function() { return true; }
});

<div className={getClassNames({class1: true, class2 : false})} />

c
cmcnphp

我理解这个问题 id 是 angular,但如果有人使用 React 或基于 React 的框架(Amplify、NextJS、Serverless 等),解决方案要容易得多。最高效的方法是使用三元运算符,如下所示:

<div className={condition ? "classnameiftrue" : "classnameiffalse"}>

如果使用 useState(),您可以使用此策略为树设置动画,因为每次状态更改时都会使用新值重新加载该条件。