Angular 2+のngShowとngHideに相当するものは何ですか?


回答:


951

hiddenプロパティにバインドするだけ

[hidden]="!myVar"

こちらもご覧ください

問題

hiddenただし、displayプロパティのCSSと競合する可能性があるため、いくつかの問題があります。

Plunkerの例では、スタイルがあるため非表示にならないのsome確認してください

:host {display: block;}

セットする。(これは他のブラウザでは動作が異なる可能性があります-私はChrome 50でテストしました)

回避策

追加することで修正できます

[hidden] { display: none !important;}

のグローバルスタイルにindex.html

別の落とし穴

hidden="false"
hidden="{{false}}"
hidden="{{isHidden}}" // isHidden = false;

と同じです

hidden="true"

要素は表示されません。

hidden="false""false"真実と見なされる文字列を割り当てます。
値のみ、falseまたは属性を削除すると、実際に要素が表示されます。

を使用する{{}}と、式も文字列に変換され、期待どおりに機能しません。

の代わりにとして割り当てられている[]ため、とのバインドのみが期待どおりに機能します。falsefalse"false"

*ngIf[hidden]

*ngIfプロパティを[hidden]変更しながら、コンテンツをDOMから効果的に削除し、コンテンツをdisplay表示しないようにブラウザに指示するだけで、DOMにはまだコンテンツが含まれています。


21
非表示の使用は実際には推奨されません。 angularjs.blogspot.com/2016/04/...
サム

7
*ngIfほとんどの場合は正しい方法かもしれませんが、実際には要素を視覚的に非表示にしたい場合があります。ヘルプ付きのCSSスタイル[hidden]{display:none!important}。これは、たとえば、Bootstrapが[hidden]要素を実際に非表示にする方法です。GitHubを参照
CunningFatalist 2017年

* ngIf内で(myStream | async)パイプを使用すると、いくつかの問題が発生する可能性があります(myStream | async)パイプも使用
Pavel Blagodov

1
あなたは私の救い主です!* ngIfを使用すると、DOMの位置が上部にリセットされますが、[非表示]で問題が解決され、位置が保持されました。
Santosh

1
* ngIfよりも[hidden]を使用したい場合の1つは、HostListenerを使用していて(ドキュメントのクリックとevent.targetを区別したい)、要素を表示および非表示にしようとするとき(カスタムドロップダウンなど)
akhouri

141

次の[hidden]属性を使用します。

[hidden]="!myVar"

またはあなたが使うことができます *ngIf

*ngIf="myVar"

これらは、要素を表示/非表示にする2つの方法です。唯一の違いは*ngIf、DOMから要素を削除する一方で、要素をDOMに保持することで[hidden]CSS displayプロパティを使用して要素を表示/非表示にするようブラウザに指示することです。


3
[非表示]は、条件付きで属性を「非表示」に要素に追加しています。[何でも]または[ali]の場合もあります。なし:ここで重要なことは、「隠された」属性を言及CSSルールを表示しなければならロードすることである
ガブリエル

5
注意:* ngIfと[hidden]は基本的に異なります。ngIfは、条件がtrueになるまで* ngIfブロック内のコンテンツを評価しません。asyncパイプを使用する場合、これは特に重要です。オブザーバブルへのサブスクリプションは、条件がtrueになった後にのみ追加されるためです。
ダイナロン

2
考慮すべきもう1つのことは、* ngIfはコンポーネントを破棄し、[非表示]にしてコンポーネントを有効な状態に保ちながら、再作成する必要があることです。リソースを大量に消費するコンポーネントがある場合は、それを破壊するのではなく非表示にする方が望ましい場合があります
Michael Kork。

1
それらは同じものではありません。
KamuranSönecek18年

36

私は同じ状況にありますが、要素がフレックスコンテナーの場合とは異なります。そうでない場合、簡単な回避策は次のとおりです。

[style.display]="!isLoading ? 'block' : 'none'"

私の場合、問題を回避するために、サポートしている多くのブラウザーがベンダープレフィックスを必要としているため、別の簡単な解決策を探しました

[class.is-loading]="isLoading"

CSSは次のように単純です

&.is-loading { display: none } 

そのままにして、表示された状態をデフォルトのクラスで処理します。


1
これは、ブートストラップ4 invalid-feedbackクラスでうまく機能します。
Jess

25

申し訳ありませんが、Angular 2を使用する際に安全ではないと見なされる非表示へのバインドに同意する必要があります。これは、非表示のスタイルが次のように簡単に上書きされる可能性があるためです

display: flex;

推奨されるアプローチは、より安全な* ngIfを使用することです。詳細については、公式Angularブログを参照してください。Angular 2で回避すべき5つの新人の間違い

<div *ngIf="showGreeting">
   Hello, there!
</div>

12
正確な要件を知る前に、何か悪いことを言うのは新人の間違いだと思います。要素を削除、破棄、追加、再作成したくない場合は、適切*ngIfな選択ではありません。しかし、あなたは結果が考慮される必要があるということは正しく、落とし穴を指摘することは常に良い考えです。
ギュンターZöchbauer

2
あなたが言っていることがわかります。それは初心者の間違いであるという私の言葉ではありません、それはAngular 2公式ブログから取られました。誰かを怒らせるつもりはありません。指摘してくれてありがとう。
Tim Hong

9
ええ、私はngIfこの質問が尋ねていることを正確に答えるとは思いません。を含むページの一部のコンテンツを非表示にしたい<router-outlet>。を使用するngIfと、コンセントが見つからないというエラーが表示されます。私はコンセントをする必要が隠されて、私のデータがロードされるまではない不在の私のデータがロードされるまで。
Jason Swett、2016年

私はあなたに同意しますが、私が抱えている問題は、フォームを表示し、* ngIfを使用する場合に値を入力することです。それが定義されていないというエラーが発生し、非表示のプロパティでうまく機能しています
Hazemハサン

@HazemHASAN、確かに。わかります。ソリューションは常に条件付きです。あなたの場合、フォームに対して他のコードを実行する前に、フォームがそこにあるかどうかを確認することが可能かどうかはわかりません。それはすべてトレードオフについてです。誤って将来別のスタイリングによってオフセットされないフォームを非表示にする安全な方法が必要ですか?または、フォームが存在するかどうかを確認しないようにしたいですか?
Tim Hong

4

スタイルがdisplay noneである場合は、ngStyleディレクティブを使用して表示を直接変更することもできます。ブートストラップDropDownの場合、ULが表示されないように設定されています。

そこで、ULを「手動で」切り替えて表示するクリックイベントを作成しました

<div class="dropdown">
    <button class="btn btn-default" (click)="manualtoggle()"  id="dropdownMenu1" >
    Seleccione una Ubicación
    <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" [ngStyle]="{display:displayddl}">
        <li *ngFor="let object of Array" (click)="selectLocation(location)">{{object.Value}}</li>                                
     </ul>
 </div>    

次に、コンポーネントで毎回切り替えるshowDropDown:bool属性を使用し、intに基づいて、スタイルのdisplayDDLを次のように設定します。

showDropDown:boolean;
displayddl:string;
manualtoggle(){
    this.showDropDown = !this.showDropDown;
    this.displayddl = this.showDropDown ? "inline" : "none";
}

4

Angular 1のngShowngHideのドキュメントによると、これらのディレクティブは両方とも、display: none !important;そのディレクティブの条件に従って要素にcssスタイルを追加します(ngShowの場合はfalse値にcssを追加し、ngHideの場合はtrue値にcssを追加します)。

Angular 2ディレクティブngClassを使用してこの動作を実現できます:

/* style.css */
.hide 
{
    display: none !important;
}

<!-- old angular1 ngShow -->
<div ng-show="ngShowVal"> I'm Angular1 ngShow... </div>

<!-- become new angular2 ngClass -->
<div [ngClass]="{ 'hide': !ngShowVal }"> I'm Angular2 ngShow... </div>

<!-- old angular2 ngHide -->
<div ng-hide="ngHideVal"> I'm Angular1 ngHide... </div>

<!-- become new angular2 ngClass -->
<div [ngClass]="{ 'hide': ngHideVal }"> I'm Angular2 ngHide... </div>

用することをお知らせshowAngular2での動作我々が追加する必要があり!ngShowVal前に(ない)、とのためにhideAngular2での動作私たちはしていない追加する必要があり!ngHideVal前に(ではありません)。


4
<div [hidden]="myExpression">

myExpressionはtrueまたはfalseに設定できます


2
<div hidden="{{ myExpression }}">「myExpression」はHTMLでレンダリングされる文字列に変換されるため、これは機能しません。文字列「true」と「false」はどちらも真実であるため、常に非表示になります
Viprus


3

ブートストラップ4.0では、クラス "d-none" = "display:none!important;"

<div [ngClass]="{'d-none': exp}"> </div>

3

この問題に遭遇した他の誰かにとって、これは私がそれを達成した方法です。

import {Directive, ElementRef, Input, OnChanges, Renderer2} from "@angular/core";

@Directive({
  selector: '[hide]'
})
export class HideDirective implements OnChanges {
  @Input() hide: boolean;

  constructor(private renderer: Renderer2, private elRef: ElementRef) {}

  ngOnChanges() {
    if (this.hide) {
      this.renderer.setStyle(this.elRef.nativeElement, 'visibility', 'hidden');
    } else {
      this.renderer.setStyle(this.elRef.nativeElement, 'visibility', 'visible');
    }
  }
}

'visibility'要素が占めるスペースを確保したかったので使用しました。そうしたくない場合は、'display'それを使用してに設定でき'none'ます。

これを動的に、または動的にhtml要素にバインドできます。

<span hide="true"></span>

または

<span [hide]="anyBooleanExpression"></span>

2

モデルをコントロールにバインドし、CSSを指定するように非表示を使用します。

HTML:

<input type="button" class="view form-control" value="View" [hidden]="true" />

CSS:

[hidden] {
   display: none;
}

2

これは私のために働いたものです:

<div [style.visibility]="showThis ? 'visible' : 'hidden'">blah</div>


1

私にとって、[hidden]=!var働いたことはありません。

そう、 <div *ngIf="expression" style="display:none;">

そして、 <div *ngIf="expression">常に正しい結果を与える。


0

Angularドキュメントには2つの例がありますhttps://angular.io/guide/structural-directives#why-remove-rather-than-hide

ディレクティブは、表示スタイルをnoneに設定することにより、代わりに不要な段落を非表示にすることができます。

<p [style.display]="'block'">
  Expression sets display to "block".
  This paragraph is visible.
</p>

<p [style.display]="'none'">
  Expression sets display to "none".
  This paragraph is hidden but still in the DOM.
</p>

[style.display] = "'block'"を使用してngShowを置き換え、[style.display] = "'none'"を使用してngHideを置き換えることができます。


0

を使用してこの問題に対処する最良の方法ngIf これは、その要素がフロントエンドでレンダリングされるのを防ぐので、

あなたが使用する[hidden]="true"かスタイルを非表示に[style.display]すると、フロントエンドの要素のみが非表示になり、誰かが値を変更して簡単に表示できるようになります。私の考えでは、要素を非表示にする最良の方法はngIf

<div *ngIf="myVar">stuff</div>

また、複数の要素がある場合(他にも実装する必要がある)、<ng-template>オプションを使用できます

<ng-container *ngIf="myVar; then loadAdmin else loadMenu"></ng-container>
<ng-template #loadMenu>
     <div>loadMenu</div>
</ng-template>

<ng-template #loadAdmin>
     <div>loadAdmin</div>
</ng-template>  

ng-templateコードのサンプル


0

AngularJSに付属している対称的なhidden/ shownディレクティブを使用したいだけの場合は、属性ディレクティブを記述してテンプレートを単純化することをお勧めします(Angular 7でテスト済み)。


import { Directive, Input, HostBinding } from '@angular/core';

@Directive({ selector: '[shown]' })
export class ShownDirective {
  @Input() public shown: boolean;

  @HostBinding('attr.hidden')
  public get attrHidden(): string | null {
    return this.shown ? null : 'hidden';
  }
}

他のソリューションの多くは正しいです。可能な限り使用する必要*ngIfあります。hidden属性を使用すると、予期しないスタイルが適用される可能ありますが、他のコンポーネントを作成しているのでない限り、それがそうであるかどうかはおそらくわかります。したがって、このshownディレクティブが機能するためには、以下を追加する必要があります。

[hidden]: {
  display: none !important;
}

どこかにあなたのグローバルスタイルに。

これらを使用すると、次のようにディレクティブを使用できます。

<div [shown]="myVar">stuff</div>

対称的な(そして反対の)バージョンでは次のようになります:

<div [hidden]="myVar">stuff</div>

shouldsに追加するために-yousは、そのような接頭辞[acmeShown]vsのような接頭辞も必要[shown]です。

shown属性ディレクティブを使用した主な理由は、非表示にされているコンテンツにXHRラウンドトリップを引き起こすコンテナーコンポーネントが含まれている場合に、AngularJSコードをAngular -AND-に変換するためです。私が使用しない理由[hidden]="!myVar"は、次のように複雑になることが多いためです。[hidden]="!(myVar || yourVar) && anotherVar" - yes I can invert that, but it is more error prone.[示されている] `の方が簡単に考えることができます。


-1

ボタンのdivを表示または非表示にするには、角度6でクリックします。

HTMLコード

<button (click)=" isShow=!isShow">FormatCell</button>
<div class="ruleOptionsPanel" *ngIf=" isShow">
<table>
<tr>
<td>Name</td>
<td>Ram</td>
</tr>
</table>
</div>

コンポーネント.tsコード

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent{
 isShow=false;
  }

これは私にとってはうまくいき、angular6のng-hideとng-showを置き換える方法です。

楽しい...

ありがとう


ngShowとは異なるngIfを使用しています。NgIfは、DOMから要素を削除/追加します。これは、要素にCssスタイルを追加/削除するだけのngShow / ngHideとは異なります。
Gil Epshtain

例は長すぎ、具体的すぎます。
masterxilo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.