AngularJSテンプレートで条件を設定したい。私はYoutube APIからビデオリストを取得します。ビデオの中には16:9の比率のものと4:3の比率のものがあります。
私はこのような条件を作りたいです。
if video.yt$aspectRatio equals widescreen then
element's attr height="270px"
else
element's attr height="360px"
私はng-repeat
を使ってビデオを繰り返しています。この状態に対してどうすればよいのかわかりません。
Angularjs(バージョン1.1.5以下)はif/else
機能を提供しません。以下は、達成したいことを検討するためのいくつかのオプションです。
(バージョン1.1.5以降を使用している場合は、下の更新(#5)にジャンプしてください)
コメントで@Kirkが示唆しているように、これを行うための最も明確な方法は次のように3項演算子を使用することです。
<span>{{isLarge ? 'video.large' : 'video.small'}}</span>
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>
ng-hide
/ ng-show
ディレクティブあるいは、ng-show/ng-hide
を使用することもできますが、これを使用すると実際には大きいビデオ要素と小さいビデオ要素の両方がレンダリングされ、ng-hide
条件を満たす要素が非表示になり、ng-show
条件を満たす要素が表示されます。したがって、各ページには実際には2つの異なる要素が表示されます。
ng-class
ディレクティブです。これは次のように使用できます。
<div ng-class="{large-video: video.large}">
<!-- video block goes here -->
</div>
large-video
が真の場合、上記は基本的にdiv要素にvideo.large
cssクラスを追加します。
ngIf directive
を導入しましたng-if
ディレクティブ1.1.5
より上のバージョンでは、ng-if
ディレクティブを使うことができます。これは、提供された式がfalse
を返す場合は要素を削除し、式がelement
を返す場合はDOMにtrue
を再挿入します。次のように使えます。
<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/else機能を提供しませんが、このモジュールを含めることでそれを得ることができます:
https://github.com/zachsnow/ng-Elif
それ自身の言葉では、それは単なる「制御フロー指令の単純な集まり: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
プロパティをフィルタに渡し、その結果をテンプレートのheight属性にバインドすることで直接使用できます。
あなたのフィルタは次のようになります。
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、またはtableを表示する必要がありますが、明らかな理由で3進数を好みません。関数を呼び出すのが通常理想的です、または私の場合私はこれをしました:
<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のすべての変数が定義されているかどうかをチェックする必要がありました。私は次のようにしましたが、それは柔軟なアプローチのようです。誰かに役立つことを願っています。
テンプレート内のHTML部分:
<div *ngFor="let p of poemsInGrid; let i = index" >
<a [routerLink]="produceFassungsLink(p[0],p[3])" routerLinkActive="active">
</div>
そしてTypeScriptの部分:
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';
}
}
よろしくお願いします、
1月