如果在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/else
function。 以下是您想要实现的几个选项:
( 如果您正在使用版本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
的条件指令。 它与ngShow
和ngHide
不同之处在于元素不被隐藏,但是根本不包含在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'; } }
感谢和最好的问候,
一月