Angular中ngShow和ngHide的等价物是什么?

Mih*_*anu 508 angular-template angular-components angular

我有一些元素,我想在某些条件下可见.

在AngularJS中我会写

<div ng-show="myVar">stuff</div>
Run Code Online (Sandbox Code Playgroud)

我怎么能在Angular中做到这一点?

Gün*_*uer 865

刚刚绑定到该hidden属性

[hidden]="!myVar"
Run Code Online (Sandbox Code Playgroud)

也可以看看

问题

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

了解如何somePlunker例如没有得到隐藏,因为它有一个风格

:host {display: block;}
Run Code Online (Sandbox Code Playgroud)

组.(这可能在其他浏览器中表现不同 - 我使用Chrome 50测试过)

解决方法

您可以通过添加来修复它

[hidden] { display: none !important;}
Run Code Online (Sandbox Code Playgroud)

在全球范围内index.html.

另一个陷阱

hidden="false"
hidden="{{false}}"
hidden="{{isHidden}}" // isHidden = false;
Run Code Online (Sandbox Code Playgroud)

是一样的

hidden="true"
Run Code Online (Sandbox Code Playgroud)

并且不会显示元素.

hidden="false"将分配"false"被视为真实的字符串.
只有值false或删除属性才会使元素可见.

使用{{}}还将表达式转换为字符串,并且不会按预期工作.

只有绑定[]才会按预期工作,因为它false被指定为false而不是"false".

*ngIf VS [hidden]

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

  • 实际上不建议使用隐藏.http://angularjs.blogspot.com/2016/04/5-rookie-mistakes-to-avoid-with-angular.html (20认同)
  • 在大多数情况下,`*ngIf`可能是正确的方法,但有时你实际上想要一个元素存在,在视觉上隐藏.带有`[hidden] {display:none!important}`的CSS样式有帮助.例如,Bootstrap如何确保实际隐藏"[hidden]"元素.[见GitHub](https://github.com/twbs/bootstrap/blob/v4-dev/scss/_reboot.scss) (7认同)
  • 你是我的救星!使用 *ngIf 会将 DOM 位置重置到顶部,但 [hidden] 解决了我的问题并保留了该位置。 (2认同)
  • @Sam,你的评论具有误导性。是的,“隐藏”有其特殊性。但根据链接的文章,“实际上不建议使用隐藏”的说法是错误的。 (2认同)

Ali*_*zad 133

[hidden]="!myVar"
Run Code Online (Sandbox Code Playgroud)

要么

*ngIf="myVar"
Run Code Online (Sandbox Code Playgroud)

这是显示/隐藏元素的两种方法.[hidden]和之间的唯一区别*ngIf是,*ngIf它将添加或完全从DOM中删除元素,但[hidden]浏览器将使用CSS的display属性显示/隐藏元素,它将保留在DOM中.

  • 请记住:*ngIf和[hidden]基本上是不同的.在条件为真之前,ngIf不会评估*ngIf块内的内容.如果使用`async`管道,这一点尤其重要,因为只有在条件成立后才会添加对observable的预订! (4认同)
  • [hidden]正在向该元素添加conditionnaly属性"hidden".它也可能是[无论]还是[阿里].这里重要的是加载一个提到"隐藏"属性的CSS规则必须是display:none (3认同)
  • 还需要考虑的另一件事是* ngIf破坏了该组件,必须重新创建它,而[hidden]则使其保持活动状态并保留在内存中。如果您有资源密集的组件,则最好隐藏它而不是销毁它 (2认同)

Val*_*eve 33

我发现自己处于相同的情况,区别于我的情况,元素是一个弹性容器.如果不是你的情况,一个简单的工作可能是

[style.display]="!isLoading ? 'block' : 'none'"
Run Code Online (Sandbox Code Playgroud)

在我的情况下,由于我们支持的许多浏览器仍然需要供应商前缀以避免问题我去了另一个简单的解决方案

[class.is-loading]="isLoading"
Run Code Online (Sandbox Code Playgroud)

那里的CSS很简单

&.is-loading { display: none } 
Run Code Online (Sandbox Code Playgroud)

然后离开默认类处理的显示状态.


Tim*_*ong 25

对不起,我不同意使用Angular 2时绑定到hidden被认为是不安全的.这是因为隐藏的样式可以轻松覆盖,例如使用

display: flex;
Run Code Online (Sandbox Code Playgroud)

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

<div *ngIf="showGreeting">
   Hello, there!
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我认为在了解确切的要求之前说出一些不好的事情是一个新手的错误.如果一个人不想删除和销毁,添加和重新创建一个元素,那么`*ngIf`是一个糟糕的选择.但你是对的,需要考虑后果,并指出陷阱总是一个好主意. (10认同)
  • 是的,我不认为`ngIf'正好回答了这个问题的问题.我想在包含`<router-outlet>`的页面上隐藏一些内容.如果我使用`ngIf`,我会收到一个无法找到插座的错误.我需要_hidden_​​插座直到我的数据加载,而不是_absent_直到我的数据加载. (8认同)
  • 我明白你的意思.这不是我的意思,这是一个新手的错误,它取自Angular 2官方博客.我不是故意冒犯任何人.不过,谢谢你指出. (2认同)

Ale*_*lex 14

这对我有用:

<div [style.visibility]="showThis ? 'visible' : 'hidden'">blah</div>
Run Code Online (Sandbox Code Playgroud)


Niy*_*yaz 10

<div [hidden]="myExpression">
Run Code Online (Sandbox Code Playgroud)

myExpression 可以设置为 true 或 false

  • `&lt;div hidden="{{ myExpression }}"&gt;` 这不起作用,因为“myExpression”将被转换为要在 html 中呈现的字符串。字符串 "true" 和 "false" 都是真值,所以它总是被隐藏 (2认同)

Anj*_*ala 6

对于遇到此问题的任何其他人,这就是我完成它的方式。

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');
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用'visibility'是因为我想保留元素占用的空间。如果您不想这样做,您可以使用'display'并将其设置为'none';

您可以将它绑定到您的 html 元素,无论是否动态。

<span hide="true"></span>
Run Code Online (Sandbox Code Playgroud)

或者

<span [hide]="anyBooleanExpression"></span>
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您的情况是样式为 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>    
Run Code Online (Sandbox Code Playgroud)

然后在我每次切换的组件上,我有 showDropDown:bool 属性,并基于 int,为样式设置 displayDDL,如下所示

showDropDown:boolean;
displayddl:string;
manualtoggle(){
    this.showDropDown = !this.showDropDown;
    this.displayddl = this.showDropDown ? "inline" : "none";
}
Run Code Online (Sandbox Code Playgroud)


San*_*per 5

像使用控件绑定任何模型一样使用hidden并为其指定css

HTML:

<input type="button" class="view form-control" value="View" [hidden]="true" />
Run Code Online (Sandbox Code Playgroud)

CSS:

[hidden] {
   display: none;
}
Run Code Online (Sandbox Code Playgroud)


Gil*_*ain 5

根据ngShowngHide 的Angular 1 文档,这两个指令都根据该指令的条件将 css 样式添加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>
Run Code Online (Sandbox Code Playgroud)

请注意,对于showAngular2中的行为,我们需要在 ngShowVal!之前添加(不),而对于hideAngular2 中的行为,我们不需要在 ngHideVal!之前添加(不)。


小智 5

在 Bootstrap 4.0 中,类 "d-none" = "display: none!important;"

<div [ngClass]="{'d-none': exp}"> </div>
Run Code Online (Sandbox Code Playgroud)