在angular.js内嵌条件语句(inline conditionals in angular.j

2019-07-17 20:53发布

我不知道是否有在角的方式有条件地显示比使用NG秀等。例如在Backbone.js的我可以做的像一个模板联内容的东西其他内容:

<% if (myVar === "two") { %> show this<% } %>

但在有角的,我似乎限于显示和隐藏的东西包裹在html标签

<p ng-hide="true">I'm hidden</p>
<p ng-show="true">I'm shown</p>

什么是角的推荐方式有条件地显示和隐藏角内嵌的内容只是用{{}},而不是包装在HTML标签的内容?

Answer 1:

编辑: 下面2Toad的答案是你在找什么! 给予好评那些事儿

如果您使用角<= 1.1.4那么这个答案会做:

还有一个答案这一点。 我张贴一个单独的答案,因为它更比可能的解决方案列表的解决方案的“精确”的尝试:

这里有一个过滤器,将做一个“立即如果”(又名IIF):

app.filter('iif', function () {
   return function(input, trueValue, falseValue) {
        return input ? trueValue : falseValue;
   };
});

并且可以使用这样的:

{{foo == "bar" | iif : "it's true" : "no, it's not"}}


Answer 2:

角1.1.5增加了对三元运营商的支持:

{{myVar === "two" ? "it's true" : "it's false"}}


Answer 3:

成千上万的方式对皮肤这只猫。 我知道你问之间{{}} speifically,但对于其他人来这里,我认为这是值得炫耀的一些其他选项。

您$范围功能(IMO,这是在大多数情况下你最好的选择):

  app.controller('MyCtrl', function($scope) {
      $scope.foo = 1;

      $scope.showSomething = function(input) {
           return input == 1 ? 'Foo' : 'Bar';
      };
   });

 <span>{{showSomething(foo)}}</span>

的最秀,当然隐藏:

 <span ng-show="foo == 1">Foo</span><span ng-hide="foo == 1">Bar</span>

ngSwitch

 <div ng-switch on="foo">
   <span ng-switch-when="1">Foo</span>
   <span ng-switch-when="2">Bar</span>
   <span ng-switch-default>What?</span>
 </div>

自定义过滤器贝特朗建议。 (这是你最好的选择,如果你不得不一遍又一遍地做同样的事情)

app.filter('myFilter', function() {
   return function(input) {
     return input == 1 ? 'Foo' : 'Bar';
   }
}

{{foo | myFilter}}

或自定义指令:

app.directive('myDirective', function() {
   return {
     restrict: 'E',
     replace: true,
     link: function(scope, elem, attrs) {
       scope.$watch(attrs.value, function(v) {
          elem.text(v == 1 ? 'Foo': 'Bar');
       });
     }
   };
});


<my-directive value="foo"></my-directive>

就个人而言,在大多数情况下,我会与我的范围功能去的,它使标记很干净,而且它的快速和容易实现。 除非,那就是,你会被一遍又一遍的做同样的事情,在这种情况下,我与Bertrand的建议,去创建一个过滤器或可能是一个指示,视情况而定。

与往常一样, 最重要的是,你的解决方案易于维护 ,并希望测试。 那就是要您的具体情况完全依赖。



Answer 4:

我使用有条件地设置时纳克级的不能使用的类ATTR以下(例如SVG样式时):

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

同样的方法应该适用于其他的属性类型。

(我想你需要在最新的不稳定角用NG-attr-,我目前的1.1.4)

我曾经在AngularJS工作+ SVG是谈论这个问题和相关问题发表文章。 http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS



Answer 5:

对于检查变量的内容,并有一个默认的文字,你可以使用:

<span>{{myVar || 'Text'}}</span>


Answer 6:

如果我理解你很好,我认为你这样做有两种方式。

首先,你可以尝试ngSwitch和第二可能的方法是创建您自己的过滤器 。 也许ngSwitch是正确的形式给出,但如果你只想使用隐藏或显示内嵌的内容{{}}过滤器是要走的路。

这里是一个小提琴用一个简单的过滤器,例如,

<div ng-app="exapleOfFilter">
  <div ng-controller="Ctrl">
    <input ng-model="greeting" type="greeting">
      <br><br>
      <h1>{{greeting|isHello}}</h1>
  </div>
</div>

angular.module('exapleOfFilter', []).
  filter('isHello', function() {
    return function(input) {
      // conditional you want to apply
      if (input === 'hello') {
        return input;
      }
      return '';
    }
  });

function Ctrl($scope) {
  $scope.greeting = 'hello';
}


Answer 7:

角UI库有内置的指令界面,如果在模板条件/浏览次数高达角度UI 1.1.4

例如:支持在角UI高达UI 1.1.4

<div ui-if="array.length>0"></div>

NG-如果在所有角版本1.1.4后

<div ng-if="array.length>0"></div>

如果您在数组变量的任何数据,那么只有在div就会出现



Answer 8:

因此,与角1.5.1(对其他一些MEAN堆栈依赖现有的应用程序依赖就是为什么我不是目前使用1.6.4)

这对我的作品像OP说{{myVar === "two" ? "it's true" : "it's false"}} {{myVar === "two" ? "it's true" : "it's false"}}

{{vm.StateName === "AA" ? "ALL" : vm.StateName}}


Answer 9:

如果要在值为“0”,显示“无”,你可以使用:

<span> {{ $scope.amount === "0" ?  $scope.amount : "None" }} </span>

在角JS或真假

<span> {{ $scope.amount === "0" ?  "False" : "True" }} </span>


Answer 10:

作品即使在异国情调的情况:

<br ng-show="myCondition == true" />


Answer 11:

我会在混合扔雷:

https://gist.github.com/btm1/6802312

这个评估if语句一次,并不会增加手表监听器,但你可以添加额外的属性具有设置好象叫等待换=“somedata.prop”,它会等待数据或属性被设置之前元素评估if语句一次。 如果你从一个XHR请求等待数据附加属性可以非常方便。

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');
              });
            }
          }
        };
      }
    };
  });


文章来源: inline conditionals in angular.js