0
votes

I'm creating a YouTube style (like-dislike) buttons for my twitter like website. But i had a problem with implementing like-dislike buttons , i am using Angular Node.js MYSQL , with NgFor loop and ngIf condition ,i had two tables posts{post_id, user_id,description} and likes{like_id, user_id, post_id, like_status} with common keys user_id, post_id.

If we don't have any values of particular user in likes table how can we write the condition to show the basic button

<div class="container" *ngFor="let post of posts; let i = index ">
   <h6> {{post.description}} </h6>
   <div class="row">          
     <div class="col-md-3">
       <div *ngFor="let like of likes; ">

         <div *ngIf="((post.user_id==like.user_id) && (post.post_id==like.post_id) && (like.like_status=='like'))">
                <button type="button" class="btn btn-success" (click)=likeSubmit(post.user_id,post.post_id)><i class="fa fa-thumbs-up"
                    aria-hidden="true"></i></button>
              </div>

         <div *ngIf="((post.user_id==like.user_id) && (post.post_id==like.post_id) && (like.like_status=='unlike'))">
                <button type="button" class="btn btn-warning" (click)=likeSubmit(post.user_id,post.post_id)><i class="fa fa-thumbs-up"
                    aria-hidden="true"></i></button>
              </div>

<!---problem with ngIf condition -->
       <div *ngIf="ngIf condition">
                <button type="button" class="btn btn-basic" (click)=likeSubmit(post.user_id,post.post_id)><i
                    class="fa fa-thumbs-up" aria-hidden="true"></i></button>
              </div>

First two ngIf conditions are working good but i am unable to put perfect ngIf contion for last one , if button like_status == like, & like_status==unlike working good , if we don't have any values in like table how can we write ngIf condition o show the button

1

1 Answers

0
votes

You are doing that a little bit incorrectly, you don't need to perform inner loop in your template, you can perform just join of two tables in your component logic, and afterwards just render required data. Try to add method into your component that joins two tables, and then you can easily do what you want in template. Example:

Ts File

...
    public getPostsWithLikes() {
        this.posts.map(post => {
            const like = this.likes && this.likes.find(plike => post.user_id === plike.user_id && post.post_id === plike.post_id);
            return {post, like};
        });
    }
...

Html file

<div class="container" *ngFor="let item of getPostsWithLikes(); let i = index ">
   <h6> {{item.post.description}} </h6>
   <div class="row">          
     <div class="col-md-3">
         <div *ngIf="item.like && item.like.like_status=='like'">
                <button type="button" class="btn btn-success" (click)=likeSubmit(item.post.user_id,item.post.post_id)><i class="fa fa-thumbs-up"
                    aria-hidden="true"></i></button>
              </div>

         <div *ngIf="item.like && item.like.like_status=='unlike'">
                <button type="button" class="btn btn-warning" (click)=likeSubmit(item.post.user_id,item.post.post_id)><i class="fa fa-thumbs-up"
                    aria-hidden="true"></i></button>
              </div>

<!---if you don't have related record in likes table, like would be null (false), so you just need to invert it-->
       <div *ngIf="!item.like">
                <button type="button" class="btn btn-basic" (click)=likeSubmit(item.post.user_id,item.post.post_id)><i
                    class="fa fa-thumbs-up" aria-hidden="true"></i></button>
              </div>

Hope that helps.