Mam wiele elementów, które chcę być widoczne w określonych warunkach.
W AngularJS napisałbym
<div ng-show="myVar">stuff</div>
Jak mogę to zrobić w Angular 2+?
angular
angular-components
angular-template
Mihai Răducanu
źródło
źródło
Odpowiedzi:
Wystarczy powiązać z
hidden
właściwościąZobacz też
problemy
hidden
ma jednak pewne problemy, ponieważ może powodować konflikt z CSS dladisplay
właściwości.Zobacz, jak
some
w przykładzie Plunkera nie ukrywa się, ponieważ ma swój stylzestaw. (To może zachowywać się inaczej w innych przeglądarkach - testowałem z Chrome 50)
obejście
Możesz to naprawić, dodając
Do globalnego stylu w
index.html
.kolejna pułapka
są takie same jak
i nie pokaże elementu.
hidden="false"
przypisze ciąg,"false"
który jest uważany za prawdziwy.Tylko wartość
false
lub usunięcie atrybutu sprawi, że element będzie widoczny.Użycie
{{}}
również przekształca wyrażenie w ciąg znaków i nie będzie działać zgodnie z oczekiwaniami.Tylko wiązanie z
[]
będzie działać zgodnie z oczekiwaniami, ponieważfalse
jest przypisane jakofalse
zamiast"false"
.*ngIf
vs[hidden]
*ngIf
skutecznie usuwa jego zawartość z DOM, a jednocześnie[hidden]
modyfikujedisplay
właściwość i instruuje przeglądarkę, aby nie pokazywała zawartości, ale DOM nadal ją zawiera.źródło
*ngIf
w większości przypadków może być poprawny, ale czasami naprawdę chcesz, aby element był tam, wizualnie ukryty. Styl CSS z[hidden]{display:none!important}
pomocą. Tak na przykład Bootstrap upewnia się, że[hidden]
elementy są faktycznie ukryte. Zobacz GitHubUżyj
[hidden]
atrybutu:Lub możesz użyć
*ngIf
Są dwa sposoby pokazywania / ukrywania elementu. Jedyną różnicą jest:
*ngIf
usunie element z DOM, a jednocześnie[hidden]
powie przeglądarce, aby pokazał / ukrył element za pomocądisplay
właściwości CSS , trzymając element w DOM.źródło
async
potoku, ponieważ subskrypcja obserwowalnego zostanie dodana dopiero po spełnieniu warunku!Znalazłem się w tej samej sytuacji z tą różnicą, co w moim przypadku, element był elastycznym pojemnikiem. Jeśli nie jest to twój przypadek, łatwym obejściem może być
w moim przypadku ze względu na fakt, że wiele obsługiwanych przez nas przeglądarek nadal potrzebuje prefiksu dostawcy, aby uniknąć problemów, wybrałem inne łatwe rozwiązanie
gdzie wtedy CSS jest prosty jak
aby opuścić następnie wyświetlany stan obsługiwany przez klasę domyślną.
źródło
invalid-feedback
klasą bootstrap 4 .Przepraszam, muszę się nie zgodzić z powiązaniem z ukrytym, które jest uważane za niebezpieczne podczas korzystania z Angular 2. Jest tak, ponieważ ukryty styl można łatwo zastąpić, na przykład za pomocą
Zalecanym podejściem jest użycie * ngIf, który jest bezpieczniejszy. Więcej informacji można znaleźć na oficjalnym blogu Angular. 5 błędów początkujących, których należy unikać dzięki Angular 2
źródło
*ngIf
jest złym wyborem. Ale masz rację, że należy wziąć pod uwagę konsekwencje, a wskazanie pułapek jest zawsze dobrym pomysłem.ngIf
, żeby dokładnie odpowiedziała na to pytanie. Chcę ukryć niektóre treści na stronie zawierającej<router-outlet>
. Jeśli użyjęngIf
, pojawia się błąd, że nie można znaleźć gniazdka. Potrzebuję ukryć ujście do momentu wczytania danych, a nieobecność do momentu załadowania danych.Jeśli twoim przypadkiem jest brak wyświetlania stylu, możesz również użyć dyrektywy ngStyle i bezpośrednio zmodyfikować wyświetlanie, zrobiłem to dla bootstrapu DropDown, UL na nim jest ustawiony na brak wyświetlania.
Stworzyłem więc zdarzenie kliknięcia do „ręcznego” przełączania UL, aby wyświetlić
Następnie w komponencie mam atrybut showDropDown: bool, który przełączam za każdym razem i na podstawie int, ustaw displayDDL dla stylu w następujący sposób
źródło
Zgodnie z dokumentacją Angular 1 ngShow i ngHide , obie te dyrektywy dodają styl css
display: none !important;
do elementu zgodnie z warunkiem tej dyrektywy (dla ngShow dodaje css dla fałszywej wartości, a dla ngHide dodaje css dla prawdziwej wartości).Możemy osiągnąć to zachowanie, stosując dyrektywę Angular 2 ngClass:
Zauważ, że dla
show
zachowania w Angular2 musimy dodać!
(nie) przed ngShowVal, a dlahide
zachowania w Angular2 nie musimy dodawać!
(nie) przed ngHideVal.źródło
myExpression może być ustawiony na true lub false
źródło
<div hidden="{{ myExpression }}">
To nie zadziała, ponieważ „myExpression” zostanie przekonwertowany na ciąg znaków do renderowania w html. Zarówno ciąg „prawda”, jak i „fałsz” są prawdziwe, więc zawsze będą ukryteJeśli używasz Bootstrap jest tak proste:
źródło
[hidden]
robi to samo, więc polecam[hidden]
w bootstrap 4.0 klasa "d-none" = "display: none! ważne;"
źródło
Dla każdego, kto natknie się na ten problem, tak to osiągnąłem.
Użyłem,
'visibility'
ponieważ chciałem zachować przestrzeń zajmowaną przez element. Jeśli nie chcesz tego zrobić, możesz po prostu użyć go'display'
i ustawić na'none'
;Możesz powiązać go z elementem HTML, dynamicznie lub nie.
lub
źródło
Użyj ukrytego, jakbyś powiązał dowolny model z kontrolą i podaj dla niego css :
HTML:
CSS:
źródło
to działało dla mnie:
źródło
źródło
dla mnie
[hidden]=!var
nigdy nie działał.Więc,
<div *ngIf="expression" style="display:none;">
I
<div *ngIf="expression">
Zawsze podawaj prawidłowe wyniki.źródło
Istnieją dwa przykłady dokumentów Angular https://angular.io/guide/structural-directives#why-remove-rather-than-hide
Możesz użyć [style.display] = "'block'", aby zastąpić ngShow, a [style.display] = "'none'", aby zastąpić ngHide.
źródło
Najlepszy sposób na rozwiązanie tego problemu,
ngIf
ponieważ dobrze zapobiegają renderowaniu tego elementu w interfejsie,Jeśli użyjesz
[hidden]="true"
lub ukryjesz styl, ukryje[style.display]
on tylko element z przodu, a ktoś może łatwo zmienić wartość i łatwo ją zobaczyć. Moim zdaniem najlepszym sposobem na ukrycie elementu jestngIf
a także Jeśli masz wiele elementów (musisz zaimplementować także inne), możesz użyć
<ng-template>
opcjiprzykładowy kod szablonu ng
źródło
Jeśli chcesz po prostu użyć symetrycznych
hidden
/shown
dyrektyw, które dostarczono z AngularJS, proponuję napisać dyrektywę atrybutów, aby uprościć takie szablony (testowane z Angular 7):Wiele innych rozwiązań jest poprawnych. Państwo powinno używać
*ngIf
gdziekolwiek to możliwe. Użycie tegohidden
atrybutu może mieć zastosowanie nieoczekiwanych stylów, ale chyba że piszesz komponenty dla innych, prawdopodobnie wiesz, czy tak jest. Aby tashown
dyrektywa zadziałała, należy również upewnić się, że dodano:gdzieś w swoich globalnych stylach.
Dzięki nim możesz użyć dyrektywy w następujący sposób:
z wersją symetryczną (i przeciwną):
Aby dodać do rzeczy - powinieneś również nam prefiks taki jak
[acmeShown]
kontra kontra tylko[shown]
.Głównym powodem, dla którego użyłem
shown
dyrektywy atrybutowej, jest konwersja kodu AngularJS na Angular -AND-, gdy ukryta zawartość zawiera komponenty kontenera, które powodują objazdy XHR w obie strony. Powodem, dla którego nie tylko używam,[hidden]="!myVar"
jest to, że dość często jest to bardziej skomplikowane, jak:[hidden]="!(myVar || yourVar) && anotherVar" - yes I can invert that, but it is more error prone.
[pokazano] `po prostu łatwiej jest myśleć.źródło
Aby ukryć i wyświetlić div na przycisku, kliknij kątowo 6.
Kod HTML
Kod komponentu .ts
to działa dla mnie i jest to sposób na zastąpienie ng-hide i ng-show w angular6.
cieszyć się...
Dzięki
źródło