如果在AngularJS模板中的其他语句

我想在AngularJS模板中做一个条件。 我从Youtube API获取video列表。 部分video比例为16:9,部分video比例为4:3。

我想要这样一个条件:

if video.yt$aspectRatio equals widescreen then element's attr height="270px" else element's attr height="360px" 

我使用ng-repeat迭代video。 不知道该怎么办这个情况:

  • 在范围中添加一个函数?
  • 在模板中做?

Angularjs(版本低于1.1.5)不提供if/elsefunction。 以下是您想要实现的几个选项:

如果您正在使用版本1.1.5或更高版本,请跳到下面的更新(#5)

1.三元操作符:

正如@Kirk在评论中所build议的那样,这样做最简洁的方法是使用三元运算符,如下所示:

 <span>{{isLarge ? 'video.large' : 'video.small'}}</span> 

2. ng-switch指令:

可以使用类似下面的东西。

 <div ng-switch on="video"> <div ng-switch-when="video.large"> <!-- code to render a large video block--> </div> <div ng-switch-default> <!-- code to render the regular video block --> </div> </div> 

3. ng-hide / ng-show指令

另外,你也可以使用ng-show/ng-hide但是使用这个会实际上渲染一个大video和一个小video元素,然后隐藏符合ng-hide条件的那个,并且显示符合ng-show条件的那个。 所以在每个页面上,实际上都会渲染两个不同的元素。

4.要考虑的另一个select是ng-class指令。

这可以使用如下。

 <div ng-class="{large-video: video.large}"> <!-- video block goes here --> </div> 

以上基本上会增加一个large-video CSS类的div元素,如果video.large是真的。

更新: Angular 1.1.5引入了ngIf directive

5. ng-if指令:

1.1.5以上的版本中,你可以使用ng-if指令。 如果提供的expression式返回false ,则会移除元素,如果expression式返回false ,则将该element重新插入到DOM中。 可以使用如下。

 <div ng-if="video == video.large"> <!-- code to render a large video block--> </div> <div ng-if="video != video.large"> <!-- code to render the regular video block --> </div> 

在最新版本的Angular(自1.1.5开始)中,它们包含一个名为ngIf的条件指令。 它与ngShowngHide不同之处在于元素不被隐藏,但是根本不包含在DOM中。 它们对于创造成本昂贵但不被使用的组件非常有用:

 <div ng-if="video == video.large"> <!-- code to render a large video block--> </div> <div ng-if="video != video.large"> <!-- code to render the regular video block --> </div> 

三元是这样做的最清楚的方法。

 <div>{{ConditionVar ? 'varIsTrue' : 'varIsFalse'}}</div> 

Angular本身并不提供if / elsefunction,但你可以通过包含这个模块来获得它:

https://github.com/zachsnow/ng-elif

用它自己的话来说,它只是“控制stream程指令的简单集合:ng-if,ng-else-if和ng-else”。 使用起来很简单直观。

例:

 <div ng-if="someCondition"> ... </div> <div ng-else-if="someOtherCondition"> ... </div> <div ng-else> ... </div> 

你可以直接使用你的video.yt$aspectRatio属性,通过filter,并将结果绑定到你的模板的height属性。

你的filter看起来像这样:

 app.filter('videoHeight', function () { return function (input) { if (input === 'widescreen') { return '270px'; } else { return '360px'; } }; }); 

而模板将是:

 <video height={{video.yt$aspectRatio | videoHeight}}></video> 

在这种情况下,您需要根据对象属性“计算”一个像素值。

我将在控制器中定义一个函数来计算像素值。

在控制器中:

 $scope.GetHeight = function(aspect) { if(bla bla bla) return 270; return 360; } 

然后在你的模板里写下:

 element height="{{ GetHeight(aspect) }}px " 

我同意三元非常干净。 似乎这是非常情况,虽然我需要显示div或p或表的东西,所以对于一个表我不喜欢三元出于显而易见的原因。 打电话给一个function通常是理想的,或者在我的情况下,我这样做:

 <div ng-controller="TopNavCtrl"> <div ng-if="info.host ==='servername'"> <table class="table"> <tr ng-repeat="(group, status) in user.groups"> <th style="width: 250px">{{ group }}</th> <td><input type="checkbox" ng-model="user.groups[group]" /></td> </tr> </table> </div> <div ng-if="info.host ==='otherservername'"> <table class="table"> <tr ng-repeat="(group, status) in user.groups"> <th style="width: 250px">{{ group }}</th> <td><input type="checkbox" ng-model="user.groups[group]" /></td> </tr> </table> </div> </div> 
  <div ng-if="modeldate==''"><span ng-message="required" class="change">Date is required</span> </div> 

你可以像上面那样使用ng-if指令。

Angular的一个可能性:我必须在html部分包含一个if语句,我必须检查我生成的URL的所有variables是否定义。 我是这样做的,似乎是一个灵活的方法。 我希望这对别人有帮助。

模板中的html部分:

  <div *ngFor="let p of poemsInGrid; let i = index" > <a [routerLink]="produceFassungsLink(p[0],p[3])" routerLinkActive="active"> </div> 

而打字稿部分:

  produceFassungsLink(titel: string, iri: string) { if(titel !== undefined && iri !== undefined) { return titel.split('/')[0] + '---' + iri.split('raeber/')[1]; } else { return 'Linkinformation has not arrived yet'; } } 

感谢和最好的问候,

一月