Скрыть / показать с *ngIf Angular2
У меня есть два элемента, которые я хочу скрыть и показать на основе *ngIf
значение условия.
По умолчанию мой wrap
блок виден, и когда я нажимаю на один из его divs
этот wrap
блок должен исчезнуть и только выбранный div's
контент должен отображаться внутри моего span
элемент. Затем, когда я нажимаю на мой span
элемент должен исчезнуть и wrap
блок должен прийти снова со всем содержимым по умолчанию.
Для реализации этого я использую *ngIf
со значением visability
для обоих элементов, ожидая, что мои функции работают следующим образом:
wrap - visible;
span - hidden;
wrap - hidden;
span - visible;
Вот мой код:
@Component({
selector: 'my-app',
template: `
<div id="wrap" class="wrap" *ngIf="visability">
<div (click)="clicked($event)">
<h2>Hello {{name}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{year}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{surname}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{country}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{cartoon}}</h2>
</div>
<div class="view">
<span id="span" (click)="showDivs()" *ngIf="visability">{{target}} </span>
</div>
`,
})
export class App {
name:string;
year: string;
surname: string;
country: string;
cartoon: string;
element: any;
target: any;
constructor() {
var wrap = document.getElementById("wrap");
var span = document.getElementById("span");
this.name = 'Angular2'
this.year = '1989'
this.surname = 'Connor'
this.country = 'USA'
this.cartoon = 'Tom & Jerry'
}
clicked(event) {
wrap.visability = false;
span.visability = true;
this.target = event.target.innerText;
}
showDivs(){
span.visability = false;
wrap.visability = true;
}
}
Почему мои функции не работают должным образом?
2 ответа
Я на самом деле немного изменил ваш код. Положил visability
как верно для первого div и false для второго. Разъединить их лучше. Тогда нужно просто переключать логические значения в зависимости от клика, вот так:
Сначала объявите видимость как переменную, чтобы вы могли ссылаться на нее с помощью this
затем просто переключите видимость.
clicked(event) {
this.visability = false;
this.target = event.target.innerText;
}
а также
showDivs(){
this.visability = true;
// span.visability = false; // remove this
// wrap.visability = true; // remove this
}
и HTML соответственно:
<div id="wrap" class="wrap" *ngIf="visability">
а также
<span id="span" (click)="showDivs()" *ngIf="!visability">{{target}}</span>
Это одно из решений.
Ваш плункер
Я решил это, удалив *ngIf
для моего второго элемента. Я просто использовал *ngIf="показанный" для span
,
Затем в конструкторе я установил оба
visibility = true
а также
shown = true
Внутри функций я переключил значения на противоположные, таким образом удалось достичь того, что я хотел, хотя я не знаю, лучший ли это путь.
@Component({
selector: 'my-app',
template: `
<div id="wrap" class="wrap" *ngIf="visibility">
<div (click)="clicked($event)">
<h2>Hello {{name}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{year}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{surname}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{country}}</h2>
</div>
<div (click)="clicked($event)">
<h2>Hello {{cartoon}}</h2>
</div>
</div>
<div class="view">
<span id="span" (click)="showDivs()" *ngIf="shown">{{target}}</span>
</div>
`,
})
export class App {
name:string;
year: string;
surname: string;
country: string;
cartoon: string;
element: any;
target: any;
clicked(event) {
this.target = event.target.innerText;
this.visibility = false;
this.shown = true;
}
showDivs(){
this.shown = false;
this.visibility = true;
}
constructor() {
this.visibility = true;
this.shown = true;
this.name = 'Angular2'
this.year = '1989'
this.surname = 'Connor'
this.country = 'USA'
this.cartoon = 'Tom & Jerry'
}
}