Angular 2+中的ngShow和ngHide等效于什么?


Answers:


949

只需绑定到hidden属性

[hidden]="!myVar"

也可以看看

问题

hidden但是有一些问题,因为它可能与该display属性的CSS冲突。

了解somePlunker示例中如何不隐藏它,因为它具有样式

: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或删除属性才会使该元素可见。

使用{{}}还会将表达式转换为字符串,将无法正常工作。

只有与绑定[]才能按预期工作,因为它false被分配为false而不是"false"

*ngIf[hidden]

*ngIf有效地从DOM中删除其内容,同时[hidden]修改display属性,并且仅指示浏览器不显示内容,但DOM仍包含该内容。


21
实际上不建议使用隐藏。 angularjs.blogspot.com/2016/04/…– 2016
山姆

7
*ngIf在大多数情况下,这可能是正确的方法,但有时您实际上希望在视觉上隐藏某个元素。具有[hidden]{display:none!important}帮助的CSS样式。例如,这就是Bootstrap确保[hidden]元素实际上被隐藏的方式。参见GitHub
CunningFatalist

在* ng内使用(myStream | async)管道时,您可能会遇到一些问题如果它也使用(myStream | async)管道
Pavel Blagodov

1
你是我的救星!使用* ngIf会将DOM位置重置为顶部,但[隐藏]解决了我的问题并保留了该位置。
桑托什

1
一种情况是您可能想在* ngIf上使用[hidden](隐藏)在使用HostListener时(想要区分文档点击与event.target),而在尝试显示和隐藏元素时(例如自定义下拉菜单)
akhouri

140

使用[hidden]属性:

[hidden]="!myVar"

或者你可以使用 *ngIf

*ngIf="myVar"

这是显示/隐藏元素的两种方法。唯一的区别是:*ngIf从DOM中删除该元素,同时通过将元素保留在DOM中[hidden]来告诉浏览器使用CSS display属性显示/隐藏该元素。


3
[隐藏]有条件地向元素添加“隐藏”属性。也可以是[whatever]或[ali]。重要的是要加载一条显示“隐藏”属性的CSS规则:none
Gabriel

5
请记住:* ngIf和[hidden]是基本基不同。除非条件为真,否则ngIf不会评估* ngIf块中的内容。如果使用async管道,这尤其重要,因为只有在条件变为真后才添加对observable的订阅!
Dynalon's

2
还需要考虑的另一件事是* ngIf破坏了该组件,必须重新创建它,而[hidden]则使其保持活动状态并保留在内存中。如果你有一个资源密集的成分,可以优选以隐藏它,而不是破坏它
迈克尔的Kork。

1
他们不是同一件事。
KamuranSönecek'18年

36

我发现自己处在相同的情况下,与我遇到的情况不同的是,元素是flex容器。

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

就我而言,由于我们支持的许多浏览器仍然需要供应商前缀,以避免出现问题,因此我选择了另一个简单的解决方案

[class.is-loading]="isLoading"

那么CSS很简单

&.is-loading { display: none } 

离开然后显示状态由默认类处理。


1
这对于bootstrap 4 invalid-feedback类非常有效。
杰西

25

抱歉,我不同意绑定到使用Angular 2时被认为是不安全的隐藏对象。这是因为隐藏的样式很容易被覆盖,例如使用

display: flex;

推荐的方法是使用* ngIf,这样更安全。有关更多详细信息,请参阅官方Angular博客。Angular 2应避免的5个新秀错误

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

12
我认为在知道确切要求之前先说不好是一个菜鸟的错误。如果不希望删除,销毁元素,添加并重新创建元素,那将*ngIf是一个糟糕的选择。但是您是正确的,需要考虑后果,指出陷阱总是一个好主意。
君特Zöchbauer

2
我知道你的意思。这不是我的话,它是新手的错误,它取自Angular 2官方博客。我不是要冒犯任何人。不过,感谢您指出。
洪添

9
是的,我认为无法ngIf完全回答这个问题。我想在包含的页面上隐藏一些内容<router-outlet>。如果使用ngIf,则会收到错误消息,提示找不到出口。我需要出口被隐藏,直到我的数据加载,不缺席,直到我的数据负载。
杰森·斯威特

我同意你的看法,但我的问题是我想说明一个形式和它把价值,如果我使用* ngIf我有没有定义,并与隐藏的属性是运作良好的错误
哈齐姆HASAN

@HazemHASAN,当然。我明白。解决方案始终是有条件的。在您的情况下,不确定是否有可能在对表单运行任何其他代码之前仅检查表单是否存在。这全是权衡取舍。您是否想要一种更安全的方式隐藏表单,以免将来被其他样式意外地抵消?还是您希望不检查表格是否存在而感到方便?
Tim Hong

4

如果您的情况是样式不显示,您还可以使用ngStyle指令并直接修改显示,我这样做是为了将Bootdrop 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

根据ngShowngHide的 Angular 1文档,这两个指令都根据该指令的条件将css style添加display: none !important;到元素(对于ngShow将css添加到false值,对于ngHide将css添加到true值)。

我们可以使用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 !之前添加(而不是),对于Angular2中的hide行为,我们不需要在ngHideVal !之前添加(不)。


4
<div [hidden]="myExpression">

myExpression可以设置为true或false


2
<div hidden="{{ myExpression }}">这将不起作用,因为“ myExpression”将转换为要在html中呈现的字符串。字符串“ true”和“ false”都是真实的,因此它将始终被隐藏
Viprus


3

在bootstrap 4.0中,类“ d-none” =“显示:无!重要;

<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

使用hidden就像您将任何模型与控件绑定并为其指定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>



0

Angular文档中有两个示例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>

并且如果您有多个元素(还需要实现其他元素),则可以使用Use <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>

要在添加到应有水平 -你要跟也应该像我们这样的前缀[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的方法。

请享用...

谢谢


您正在使用ngIf-与ngShow不同。NgIf将删除/添加DOM中的元素。这与ngShow / ngHide不同,后者仅会向元素添加/删除Css样式。
吉尔·艾普斯塔恩

该示例太长且太具体。
masterxilo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.