【发布时间】:2020-01-27 12:04:03
【问题描述】:
我有一个从 api 获取用户列表并填充列表组件的方法。现在我想做什么 从 api 加载列表后,突出显示列表的第一个元素。 我已经尝试了以下方法,它与 setTimeout 一起工作正常,但是如果没有 setTimeout 函数我怎么能做到这一点
这是我尝试过的代码,
public getUserList(){
return this.http.get('https://jsonplaceholder.typicode.com/users').pipe(tap(x => {
this.lists = x;
}))
.subscribe((data) => {
setTimeout(() => {
this.clickFirstList();
}, 1000);
});
}
clickFirstList() {
Array.from(this.ulElement.nativeElement.children).forEach((element: HTMLElement, index: number) => {
if (index === 0) {
console.log(element);
element.click();
}
});
}
这是 stackblitz 上的工作代码。 https://stackblitz.com/edit/angular-brpz2j?file=src/app/search-list.component.ts
【问题讨论】:
-
不用setTimeout,所有在subscribe下的,只有在调用完成后才会执行。注意:您不使用代码中的数据,仅存储在“tap”中(您想在订阅中执行它?注意2:记住“Angular 样式规则”:创建服务以返回 observables -http.get 和其他 - 和订阅组件
-
它在订阅中不起作用。请在 stackblitz 上编辑代码并将其写为答案。
-
好吧,我看到了你的堆栈闪电战。您需要使用 setTimeout - 您可以使用 0 作为计时器 - 给 Angular 时间重新绘制列表,而不是等待调用完成。使用
setTimeout(() => { this.clickFirstList(); }); -
您可以使用解析器:这不会显示所有用户,直到您从 API 获得结果,然后您可以在订阅中做您想做的事情
-
不要像在 Angular 中那样操作 dom。没有理由这样做。拥抱角度和角度绑定。
标签: javascript angular typescript rxjs rxjs6