最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Angular - Update data automatically without Refresh the Page - Stack Overflow

programmeradmin4浏览0评论

In my application there is a table that get rows from database.

This is the AJAX CALL (SERVICE)

getPosts(): Observable<Posts[]> {
    return this.http.post<Posts[]>(this.myAppUrl + this.myApiPostsUrl, this.authService.getLoggedUserFromSessionStorage())
      .pipe(
        retry(1),
        catchError(this.errorHandler)
      );
  }

All work perfectly, but my datas dont update automatically, and the user need to refresh the page to see the new rows, how can i do this? I would like do that the new rows are added in the table dynamically ... without update the page. This is the table

COMPONENT HTML

    <table *ngIf="(posts$ | async)?.length>0" class="table align-items-center table-flush">
    .....
 <tr *ngFor="let post of (posts$ | async) | filter:authService.filter | paginate: config | orderBy: key : reverse">
              <!--              <td>{{posts.id}}</td>-->
              <td>{{post.title}}</td>
              <td>{{post.body}}</td>
.....
    </table>

COMPONENT TS

ngOnInit() {
    this.loadPosts();
  }

  loadPosts() {
    this.message = 'Loading....';
    this.posts$ = this.postService.getPosts();
    if (this.posts$ == null) {
      this.message = 'No Posts found';
    }
  }

Thanks so much.

In my application there is a table that get rows from database.

This is the AJAX CALL (SERVICE)

getPosts(): Observable<Posts[]> {
    return this.http.post<Posts[]>(this.myAppUrl + this.myApiPostsUrl, this.authService.getLoggedUserFromSessionStorage())
      .pipe(
        retry(1),
        catchError(this.errorHandler)
      );
  }

All work perfectly, but my datas dont update automatically, and the user need to refresh the page to see the new rows, how can i do this? I would like do that the new rows are added in the table dynamically ... without update the page. This is the table

COMPONENT HTML

    <table *ngIf="(posts$ | async)?.length>0" class="table align-items-center table-flush">
    .....
 <tr *ngFor="let post of (posts$ | async) | filter:authService.filter | paginate: config | orderBy: key : reverse">
              <!--              <td>{{posts.id}}</td>-->
              <td>{{post.title}}</td>
              <td>{{post.body}}</td>
.....
    </table>

COMPONENT TS

ngOnInit() {
    this.loadPosts();
  }

  loadPosts() {
    this.message = 'Loading....';
    this.posts$ = this.postService.getPosts();
    if (this.posts$ == null) {
      this.message = 'No Posts found';
    }
  }

Thanks so much.

Share Improve this question edited Nov 4, 2019 at 13:45 Toriga asked Nov 4, 2019 at 10:00 TorigaToriga 1993 gold badges7 silver badges17 bronze badges 4
  • can you show the code of the filter you are using – Prakash Pokharel Commented Nov 4, 2019 at 10:26
  • in this case, you can either re-fetch the data from the server, or upon a successful post request, modify your posts property – C.OG Commented Nov 4, 2019 at 11:05
  • @C_Ogoo I thought the same thing, but i dont know how to code this. I have to re-fetch every tot sec te data. – Toriga Commented Nov 4, 2019 at 11:08
  • @PkSharmaPokhrel It's a string taken from the search module through a service. – Toriga Commented Nov 4, 2019 at 11:09
Add a ment  | 

2 Answers 2

Reset to default 1

There are several options. Here is a reactive way of handling this. Any time getPosts is successful, you'll need to refetch the initial data.

To fetch your initial data you will need to wrap your posts$ observable in an action stream:

// create a stream for your post request
private readonly postAction$ = new Subject();

posts$ = this.postAction$.pipe(
  startWith(''),
  concatMap(()=> {
    return this.postService.getPosts(); // this will be your http get request
  }),
)

The startWith operator will cause your get request to fire initially without an observable been passed to your postAction observable.

Your getPosts method now will call this.postAction$.next() on success, that will trigger the refetch of your posts$ observable.

getPosts(): Observable<Posts[]> {
    return this.http.post<Posts[]>(this.myAppUrl + this.myApiPostsUrl, this.authService.getLoggedUserFromSessionStorage())
      .pipe(
        retry(1),
        catchError(this.errorHandler),
        tap(() => this.postAction$.next())
      );
  }

You can see a demo of this. Check the console, you'll see that the get request is fired every time the button is clicked.


With Interval

posts$ = interval(30000)
    .pipe(
      startWith(''),
      switchMap(() => return this.postService.getPosts();)
    )

Interval demo

in Angular, when you want to update your html, you need to use ngFor to update your data automatically.

<table *ngIf="(posts$ | async)?.length>0" class="table align-items-center table-flush">
   <div *ngFor="let data of datas; let i = index>
      {{ data }}
   </div>
</table>

ngFor will loop on datas and update it when it changes

发布评论

评论列表(0)

  1. 暂无评论