Хорошо, так что вот, пожалуйста. Это ваш класс стекаблица, измененный и прокомментированный.
То, что вы можете сделать для достижения своей цели, - это временно запомнить индекс установленного в данный момент флажка. Я сделал это с переменной marker
.
Я вряд ли рекомендую дождаться ngAfterViewChecked()
-hook, прежде чем вы начнете манипулировать блоком, потому что таким образом вы можете быть уверены, что у вас не будет проблем с синхронизацией, если страница когда-нибудь замедлится.
Следующий шаг - проверить, был ли установлен маркер. А затем вы должны обернуть свой реальный код возврата в функцию тайм-аута. Если вы этого не сделаете, вы столкнетесь с этой ошибкой:
ExpressionChangedAfterItHasBeenCheckedError: Выражение изменилось после его проверки. Предыдущее значение: 'модель: правда'. Текущее значение: 'модель: ложь'.
Вот и все.
Вы можете попытаться уменьшить тайм-аут дальше, чтобы флажок даже не мигал. Но всегда помните о том, что вы можете столкнуться с вышеупомянутой ошибкой, если будете действовать слишком быстро.
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
// the clicked checkbox's index
private marker: number = -1;
sampleObj = [
{'checked': false, name: 'option 1'},
{'checked': false, name: 'option 2'},
{'checked': false, name: 'option 3'},
{'checked': true, name: 'option 4'}
];
sampleFunc(event, i) {
if (event.currentTarget.checked) {
// memorize the clicked checkbox's index
this.marker = i;
}
}
toggle() : void {
this.sampleObj[1].checked = !this.sampleObj[1].checked;
}
ngAfterViewChecked(): void {
// if a marker is set
if (this.marker > -1) {
// start the timeout and then reset the checkbox
setTimeout (() => {
this.sampleObj[this.marker].checked = !this.sampleObj[this.marker].checked;
this.marker = -1;
}, 20);
}
}
}