【问题标题】:angularjs if statements?angularjs if 语句?
【发布时间】:2012-09-21 21:22:54
【问题描述】:

所以我正在浏览 AngularJS 的教程:

我在控制器中定义了一个数组,当我通过 ng-repeat {{feature.name}} {{feature.description}} 循环时,我通过调用返回数组中的不同点

我不明白的是,可以说我在数组中有第三个点,称为“重要性”,它是一个从 1 到 10 的数字。我不想在 html 中显示该数字,但我确实想要如果数组中的“重要性”数字是 10 对 1,那么要做的就是对特征应用不同的颜色

那么我如何编写一个 if 语句来做到这一点:

<p style="**insert if statement: {{if feature.importance == 10}} color:red; {{/if}} **">{{feature.description}}</p>

不知道这是否正确,但这就是我想做的事

【问题讨论】:

标签: if-statement angularjs


【解决方案1】:

我认为没有可用的if 声明。 为了您的造型目的,可以使用ng-class

<p ng-class="{important: feature.importance == 10 }">

ng-switch也很方便。

-- 更新--

看看: https://stackoverflow.com/a/18021855/1238847

angular1.2.0RC 似乎支持 ng-if。

【讨论】:

  • 你可以这样做:ng-class="border_{{4 &gt; x}}"。上面的语法不像写的那样工作。
  • 你好,我认为答案需要更新,看看我在底部的帖子。
【解决方案2】:

其实在Angular 1.2.0中有一个三元运算符。

<p style="{{feature.importance == 10 ? 'color:red' : ''}}">{{feature.description}}</p>

【讨论】:

    【解决方案3】:

    我认为答案需要更新。

    以前您可以使用 AngularUI 项目中的 ngIf 指令(如果您仍想下载它,请使用代码 here),坏消息是它不再维护。

    好消息是它已被添加到官方 AngularJS 存储库 (unstable branch) 中,并且很快将在 stable one 中提供。

    <div ng-if="something"> Foo bar </div>
    

    不仅会隐藏 DIV 元素,还会将其从 DOM 中移除(当某些东西是虚假的时)。

    【讨论】:

      【解决方案4】:

      ng-class 可能是您问题的最佳答案,但 AngularUI 有一个“if”指令:

      http://angular-ui.github.com/

      搜索: 从 DOM 中完全移除元素,而不是仅仅隐藏它。

      我使用“ui-if”来决定是否应该将数据值呈现为标签或输入,相对于当前月份:

      <tbody id="allocationTableBody">
          <tr ng-repeat="a in data.allocations">
              <td>{{a.monthAbrv}}</td>
              <td ui-if="$index < currentMonth">{{a.amounts[0]}}</td>
          </tr>
      </tbody>
      

      【讨论】:

        【解决方案5】:

        如果您的优先级是标签,您可以创建一个开关过滤器以在 ng-class 内部使用,如之前的 SO 答案所示:https://stackoverflow.com/a/8309832/1036025(用于开关过滤器代码)

        <p ng-class="feature.importance|switch:{'Urgent':'red', 'Warning': 'orange', 'Normal': 'green'}">...</p>
        

        【讨论】:

          【解决方案6】:

          你也可以试试下面这行代码

          <div class="{{is_foo && foo.bar}}">
          

          如果 is_foo 为真,则显示 foo.bar。

          【讨论】:

            【解决方案7】:

            第一个指令是一个指令,它评估某个东西是否应该只在 DOM 中出现一次,并且不向页面添加任何监视侦听器:

            angular.module('setIf',[]).directive('setIf',function () {
                return {
                  transclude: 'element',
                  priority: 1000,
                  terminal: true,
                  restrict: 'A',
                  compile: function (element, attr, linker) {
                    return function (scope, iterStartElement, attr) {
                      if(attr.waitFor) {
                        var wait = scope.$watch(attr.waitFor,function(nv,ov){
                          if(nv) {
                            build();
                            wait();
                          }
                        });
                      } else {
                        build();
                      }
            
                      function build() {
                        iterStartElement[0].doNotMove = true;
                        var expression = attr.setIf;
                        var value = scope.$eval(expression);
                        if (value) {
                          linker(scope, function (clone) {
                            iterStartElement.after(clone);
                            clone.removeAttr('set-if');
                            clone.removeAttr('wait-for');
                          });
                        }
                      }
                    };
                  }
                };
              });
            

            第二个是一个指令,它有条件地将属性仅应用于元素一次,而无需监视侦听器:

            <div set-attr="{ data-id : post.id, data-name : { value : post.name, condition : post.name != 'FOO' } }"></div>
            
            angular.module('setAttr',[]).directive('setAttr', function() {
              return {
                restrict: 'A',
                priority: 100,
                link: function(scope,elem,attrs) {
                  if(attrs.setAttr.indexOf('{') != -1 && attrs.setAttr.indexOf('}') != -1) {
                  //you could just angular.isObject(scope.$eval(attrs.setAttr)) for the above but I needed it this way
                    var data = scope.$eval(attrs.setAttr);
            
                    angular.forEach(data, function(v,k){
            
                      if(angular.isObject(v)) {
                        if(v.value && v.condition) {
                            elem.attr(k,v.value);
                            elem.removeAttr('set-attr');
                        }
                      } else {
                        elem.attr(k,v);
                        elem.removeAttr('set-attr');
                      }
                    });
                  }
                }
              }
            });
            

            当然你可以使用 Angular 内置的动态版本:

            <div ng-class="{ 'myclass' : item.iscool }"></div>
            

            您还可以使用 angularjs 添加的新 ng-if,它基本上取代了 angularui 团队创建的 ui-if,它们将有条件地从 DOM 中添加和删除内容,并添加监视侦听器以继续评估:

            <div ng-if="item.iscool"></div>
            

            【讨论】:

              【解决方案8】:

              同样有效的是:

              <span>{{ varWithValue || 'If empty use this string' }}</span> 
              

              【讨论】:

                猜你喜欢
                • 2014-07-01
                • 2023-03-25
                • 2015-07-05
                • 2014-12-12
                • 2013-03-26
                • 1970-01-01
                • 1970-01-01
                • 2015-02-06
                • 2016-03-26
                相关资源
                最近更新 更多