Angular 2 使用 setTimeout 更新 class
Angular 2 update class with setTimeout
我正在尝试向元素添加 class 并在一定时间后使用 setTimeout
将其删除。
组件
export class setClass implements OnInit {
className: string = ''
setClassName(newClass) {
this.className = newClass
setTimeout(function () {
this.className = ''
}, 1500)
}
constructor() { }
ngOnInit() {
}
}
模板
<div>
<img src="img/1.png" alt="" [ngClass]="className">
<button (click)="setClassName('foobar')">Set new class</button>
</div>
我可以看到该函数添加了 class 名称 'foobar',但它永远存在。我期待这个函数在 1500 毫秒后删除新添加的内容。
请帮我解决这个问题。
'this' 由于函数范围的原因未在您的超时函数中定义,您将无法使用它。您可以使用这样的箭头函数:
setTimeout(()=> {
this.className = ''
}, 1500)
<div>
<img src="img/1.png" #image alt="">
<button (click)="setClassName('foobar')">Set new class</button>
</div>
export class setClass implements OnInit {
className: string = ''
@ViewChild("image") image ;
setClassName(newClass) {
this.image.nativeElement.classList.add(newClass)
let self = this;
setTimeout(function () {
self.image.nativeElement.classList.remove(newClass)
}, 1500)
}
constructor() { }
ngOnInit() {
}
}
你的这一行 this.className = newClass
this
指向组件但是 this
内部超时指向 window 使用 ES6 忽略这个
setTimeout(() => {
this.className = "";
}, 1500);
或将 this
的实例存储到 vm
let vm = this;
setTimeout(function() => {
vm.className = '';
}, 1500);
两者都工作正常。
改成下面的代码就可以了。另外,有一个 plunker https://plnkr.co/edit/oEfZOW?p=preview 显示它正在工作
let $this = this;
setTimeout(function () {
$this.className = '';
}, 1500);
我正在尝试向元素添加 class 并在一定时间后使用 setTimeout
将其删除。
组件
export class setClass implements OnInit {
className: string = ''
setClassName(newClass) {
this.className = newClass
setTimeout(function () {
this.className = ''
}, 1500)
}
constructor() { }
ngOnInit() {
}
}
模板
<div>
<img src="img/1.png" alt="" [ngClass]="className">
<button (click)="setClassName('foobar')">Set new class</button>
</div>
我可以看到该函数添加了 class 名称 'foobar',但它永远存在。我期待这个函数在 1500 毫秒后删除新添加的内容。
请帮我解决这个问题。
'this' 由于函数范围的原因未在您的超时函数中定义,您将无法使用它。您可以使用这样的箭头函数:
setTimeout(()=> {
this.className = ''
}, 1500)
<div>
<img src="img/1.png" #image alt="">
<button (click)="setClassName('foobar')">Set new class</button>
</div>
export class setClass implements OnInit {
className: string = ''
@ViewChild("image") image ;
setClassName(newClass) {
this.image.nativeElement.classList.add(newClass)
let self = this;
setTimeout(function () {
self.image.nativeElement.classList.remove(newClass)
}, 1500)
}
constructor() { }
ngOnInit() {
}
}
你的这一行 this.className = newClass
this
指向组件但是 this
内部超时指向 window 使用 ES6 忽略这个
setTimeout(() => {
this.className = "";
}, 1500);
或将 this
的实例存储到 vm
let vm = this;
setTimeout(function() => {
vm.className = '';
}, 1500);
两者都工作正常。
改成下面的代码就可以了。另外,有一个 plunker https://plnkr.co/edit/oEfZOW?p=preview 显示它正在工作
let $this = this;
setTimeout(function () {
$this.className = '';
}, 1500);