【问题标题】:Alternative to setTimeout in Angular 2+在 Angular 2+ 中替代 setTimeout
【发布时间】:2018-04-03 09:16:32
【问题描述】:

我将数据发送到ngrx store。之后,我想滚动到特定的div,它正在使用来自商店的数据。

@ViewChild('datalist') private myScrollContainer: ElementRef; 

this.store.dispatch(new SetClientSearchResultsAction(filteredData));

setTimeout(() => {
this.myScrollContainer.nativeElement.scrollIntoView({ behavior:'smooth', block: 'start'});
 }, 300);

下面是 HTML div。

<div  #datalist id="mydata" *ngIf="clientSearchResults$ | async  as searchResults" 
class = 'result'>
  <p> hellooo</p>
</div>

在发送要存储的数据后,我在我的 div 上滚动。但我不想使用setTimeout。它不必要地等待 300 毫秒。是否有任何替代方法?我只想滚动到我的div,当我的数据被发送或 ngif 条件得到满足时。

下面是我从 Store 获取值的组件的构造函数。

constructor(private store: Store<AppState>,
    private formBuilder: FormBuilder, private _clientService: ClientService) {
    this.clientSearchResults$ = this.store.select('searchResults');
  }

【问题讨论】:

标签: javascript angular typescript settimeout ngrx


【解决方案1】:

你可以使用 Lifecycle 钩子,AfterViewInit Angular 初始化组件的视图和子视图/指令所在的视图后响应。

class MyComponent implements AfterViewInit {
  ngAfterViewInit() {
    // ...
  }
}

【讨论】:

  • 但是。我必须将滚动设置为 div,它将如何影响,我使用 afterview init 或 init。
【解决方案2】:

假设clientSearchResults$ 在调度SetClientSearchResultsAction 时会发出一个新值,您可以在组件中订阅clientSearchResults$ 并从那里开始滚动。

ngOnInit() {
  clientSearchResults$
  .subscribe(() => {
    this.myScrollContainer.nativeElement.scrollIntoView({ behavior:'smooth', block: 'start'});
  });
}

【讨论】:

  • 我也添加了构造函数代码,我在 clientSearchResults$ 中设置值。你现在能告诉我,我需要做什么改变吗?
  • 我也试过这个东西,在订阅中也是如此,当我在没有设置超时的情况下使用时,它不起作用。当我设置 setTimeout 时,我会滚动到我的 div。
  • 尝试按照 Rahul Sharma 的建议将其放入 ngAfterViewInit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2023-03-12
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多