visibility:hidden in Angular 2
You can set the visibility
style attribute with style binding:
<div [style.visibility]="'hidden'"></div>
<div [style.visibility]="isDivVisible ? 'visible' : 'hidden'"></div>
An example is shown in this plunker.
Edit:
You could make a directive to make this easier:
https://stackblitz.com/edit/angular-ivy-6sac33?file=src%2Fapp%2Fhide-element.directive.ts
Angular 2 Show and Hide an element
You should use the *ngIf Directive
<div *ngIf="edited" class="alert alert-success box-msg" role="alert">
<strong>List Saved!</strong> Your changes has been saved.
</div>
export class AppComponent implements OnInit{
(...)
public edited = false;
(...)
saveTodos(): void {
//show box msg
this.edited = true;
//wait 3 Seconds and hide
setTimeout(function() {
this.edited = false;
console.log(this.edited);
}.bind(this), 3000);
}
}
Update: you are missing the reference to the outer scope when you are inside the Timeout callback.
so add the .bind(this) like I added Above
Q : edited is a global variable. What would be your approach within a *ngFor-loop? – Blauhirn
A : I would add edit as a property to the object I am iterating over.
<div *ngFor="let obj of listOfObjects" *ngIf="obj.edited" class="alert alert-success box-msg" role="alert">
<strong>List Saved!</strong> Your changes has been saved.
</div>
export class AppComponent implements OnInit{
public listOfObjects = [
{
name : 'obj - 1',
edit : false
},
{
name : 'obj - 2',
edit : false
},
{
name : 'obj - 2',
edit : false
}
];
saveTodos(): void {
//show box msg
this.edited = true;
//wait 3 Seconds and hide
setTimeout(function() {
this.edited = false;
console.log(this.edited);
}.bind(this), 3000);
}
}
What is the equivalent of ngShow and ngHide in Angular 2+?
The hidden
property can be used for that
[hidden]="!myVar"
See also
- https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/hidden
issues
hidden
has some issues though because it can conflict with CSS for the display
property.
See how some
in Plunker example doesn't get hidden because it has a style
:host {display: block;}
set. (This might behave differently in other browsers - I tested with Chrome 50)
workaround
You can fix it by adding
[hidden] { display: none !important;}
To a global style in index.html
.
another pitfall
hidden="false"
hidden="{{false}}"
hidden="{{isHidden}}" // isHidden = false;
are the same as
hidden="true"
and will not show the element.
hidden="false"
will assign the string "false"
which is considered truthy.
Only the value false
or removing the attribute will actually make the element
visible.
Using {{}}
also converts the expression to a string and won't work as expected.
Only binding with []
will work as expected because this false
is assigned as false
instead of "false"
.
*ngIf
vs [hidden]
*ngIf
effectively removes its content from the DOM while [hidden]
modifies the display
property and only instructs the browser to not show the content but the DOM still contains it.
Listen to element visibility in Angular 2
ngDoCheck
is run when change detection is run, therefore I think it's the right place if you want to monitor it instead of just get it once at component creation time:
@HostListener('window:resize')
ngDoCheck() {
this.isVisible = this.element.nativeElement.offsetParent !== null;
}
There might be better option, like some events that are emitted somewhere, but for the general case ngDoCheck
should work fine.
Angular 5 ngHide ngShow [hidden] not working
2019 Update: I realize that this is somewhat bad advice. As the first comment states, this heavily depends on the situation, and it is not a bad practice to use the [hidden] attribute: see the comments for some of the cases where you need to use it and not *ngIf
Original answer:
You should always try to use *ngIf
instead of [hidden]
.
<input *ngIf="!isHidden" class="txt" type="password" [(ngModel)]="input_pw" >
There are several blog posts about that topics, but the bottom line is, that Hidden usually means you do not want the browser to render the object - using angular you still waste resource on rendering it, and it will end up in the DOM anyway (and tricky users can see it with basic browser manipulation).
Angular 2/4 list show and hide element details
The way you've done it is the best way to approach it. There are no performance penalties for doing it that way since you're using ng if which doesn't even comment the code out from the markup so you're fine :)
Angular 2 Hidden Divs still show spacing
You may try
<div class="row social-media" [ngClass]="{ 'hide': navToggleIndex!=1 }">
And I'm not sure which validation library you currently used.
But If it's jQuery Validator, you must put this options.
$.validator.setDefaults({
ignore: []
});
To prevent jQuery Validator ignores hidden elements.
Related Topics
Mattooltipclass Not Applying CSS
How to Get The Cursor to Change to The Hand When Hovering a <Button> Tag
CSS3 Transitions Want to Add a Colour and Fade It Away
Using Proper CSS Media Queries in Angular
CSS for a Sidebar Menu That Folds in and Out
Difference Between Firefox and Chrome Padding
Make Bootstrap Carousel Responsive on Height
How to Keep The Width of The Parent Element When Position: Fixed Is Applied
Why Won't Opera (11.00) Display Custom (@Font-Face) Fonts
CSS Table Border Spacing Inside Only
How to Add a Svg as Content on: Before Pseudo Element of an Element
Rails Bootstrap How to Format Form_For (Width Grid Collapses)
Slide Out Panel with Bootstrap
Adding CSS Class to Multiple Elements
Creating a Foundation-Style Block Grid in Bootstrap 3
What Does The & Mean in an SCSS Selector
Bootstrap Container with Position:Absolute Loses Layout Inside