Angular 2 Показать и скрыть элемент

У меня проблема скрыть и показать элемент в зависимости от логической переменной в Angular 2.

это код для отображения div и скрытия:

<div *ngIf="edited==true" class="alert alert-success alert-dismissible fade in" 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);
   }, 3000);
  }
}

Элемент скрыт, когда функция saveTodos запускается, элемент отображается, но через 3 секунды, даже если переменная возвращается к false, элемент не скрывается. Почему?

Ответ 1

Вы должны использовать директиву * ngIf

<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);
  }
}

Обновление: вам не хватает ссылки на внешнюю область, когда вы находитесь в обратном вызове Timeout.

так что добавьте .bind(this), как я добавил выше

Q: отредактирована глобальная переменная. Каким будет ваш подход в цикле * ngFor? - Блаухирн

A: Я бы добавил редактирование как свойство для объекта, который я повторяю.

<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);
  }
}

Ответ 2

В зависимости от того, что вы хотите достичь, есть два варианта:

  • Вы можете использовать скрытую директиву для отображения или скрытия элемента

    <div [hidden]="!edited" class="alert alert-success box-msg" role="alert">
      <strong>List Saved!</strong> Your changes has been saved.
    </div>
    
  • Вы можете использовать директиву ngIf для добавления или удаления элемента. Это отличается от скрытой директивы, потому что она не отображает/не скрывает элемент, а добавляет/удаляет из DOM. Вы можете потерять несохраненные данные элемента. Это может быть лучший выбор для отмененного компонента редактирования.

    <div *ngIf="edited" class="alert alert-success box-msg" role="alert"> 
      <strong>List Saved!</strong> Your changes has been saved.
    </div>
    

Для вас проблема изменения через 3 секунды, это может быть связано с несовместимостью с setTimeout. Вы включили в свою страницу angular2 -polyfills.js библиотеку?

Ответ 3

Если вам не нужно удалять элемент HTML-элемента, используйте * ngIf.

В противном случае используйте это:

<div [style.visibility]="(numberOfUnreadAlerts == 0) ? 'hidden' : 'visible' ">
   COUNTER: {{numberOfUnreadAlerts}} 
</div>

Ответ 4

Для дочернего компонента, который я показывал, я использовал *ngif="selectedState == 1"

Вместо этого я использовал [hidden]="selectedState!=1"

Это сработало для меня. Загрузив дочерний компонент правильно и после того, как скрытый и скрывающий дочерний компонент не был undefined после использования этого.

Ответ 5

Это хороший пример использования директивы. Нечто подобное удивительно полезно.

@Directive({selector: '[removeAfter]'}) export class RemoveAfter {
  constructor(readonly element: ElementRef<HTMLElement>) { }

  /**
   * Removes the attributed element after the specified number of milliseconds. 
   * Defaults to (1000)
   */
  @Input() removeAfter = 1000;


  ngOnInit() {
    setTimeout(() => {
      this.element.nativeElement.remove();
    }, this.removeAfter);
  }
}

Ответ 6

Мы можем сделать это, используя нижеприведенный код snipet..

Angular Код:

 export class AppComponent {  
    toggoleShowHide:string ="visible";  
 }

Шаблон HTML:

  Enter text to hide or show item in bellow: 
  <input type="text" [(ngModel)]="toggoleShowHide">
  <br>
  Toggle Show/hide:
  <div [style.visibility]="toggoleShowHide">   
     Final Release Angular 2!
  </div>

Ответ 7

В зависимости от ваших потребностей *ngIf или [ngClass]="{hide_element: item.hidden}", где класс CSS hide_element равен { display: none; }

*ngIf может вызывать проблемы, если вы меняете переменные состояния *ngIf удаляется, в тех случаях, когда требуется использовать CSS display: none;.

Ответ 8

inoabrian ответ правильный. Ваш не работал, потому что дисплей не имеет "нормального" значения. Если вы установите его в "initial", вы увидите некоторые результаты.

Ответ 9

Решение @inoabrian выше работало для меня. Я столкнулся с ситуацией, когда я обновлял свою страницу, и мой скрытый элемент снова появлялся на моей странице. Вот что я сделал, чтобы решить эту проблему.

export class FooterComponent implements OnInit {
public showJoinTodayBtn: boolean = null;

ngOnInit() {
      if (condition is true) {
        this.showJoinTodayBtn = true;
      } else {
        this.showJoinTodayBtn = false;
      }
}

Ответ 10

Просто добавьте bind (this) в функцию setTimeout, она начнет работать

setTimeout(function() {
       this.edited = false;
       console.log(this.edited);
   }.bind(this), 3000);

и изменение HTML

<div *ngIf="edited==true" class="alert alert-success alert-dismissible fade in" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>

Для

<div *ngIf="edited" class="alert alert-success alert-dismissible fade in" role="alert">
        <strong>List Saved!</strong> Your changes has been saved.
</div>